Crypt:...SL::EC(3pm)

πŸ“– Bestie, this is Crypt::OpenSSL::EC(3pm) from the User Contributed Perl Documentation section β€” pull up a chair, we're doing elliptic curves today πŸ’–

✨ NAME ✨

Crypt::OpenSSL::EC β€” it's the Perl extension for the OpenSSL EC (Elliptic Curves) library. That's it, that's the name, and honestly? iconic. πŸ¦‹

πŸŽ€ SYNOPSIS πŸŽ€

ok so here's the whole vibe in code form, literally just look at it:

use Crypt::OpenSSL::EC;
use Crypt::OpenSSL::Bignum::CTX;

# Use of $ctx is optional in all calls, here we demonstrate its use.
# If it is provided it will increase performance.
my $ctx = Crypt::OpenSSL::Bignum::CTX->new();

my $method = Crypt::OpenSSL::EC::EC_GFp_mont_method();
my $group = Crypt::OpenSSL::EC::EC_GROUP::new($method);
Crypt::OpenSSL::EC::EC_GROUP::set_curve_GFp($group, $p, $a, $b, $ctx);
my $method = Crypt::OpenSSL::EC::EC_GROUP::method_of($group);
Crypt::OpenSSL::EC::EC_GROUP::copy($tmp, $group);
Crypt::OpenSSL::EC::EC_GROUP::get_curve_GFp($group, $p, $a, $b, $ctx);

$Crypt::OpenSSL::EC::trace = 1;
Crypt::OpenSSL::EC::print_errs();
my $P = Crypt::OpenSSL::EC::EC_POINT::new($group);

Crypt::OpenSSL::EC::EC_POINT_set_to_infinity($group, $P);
my $bool = Crypt::OpenSSL::EC::EC_POINT::is_at_infinity($group, $P);

my $buf = Crypt::OpenSSL::EC::EC_POINT::point2oct($group, $Q, &Crypt::OpenSSL::EC::POINT_CONVERSION_COMPRESSED, $ctx);
Crypt::OpenSSL::EC::EC_POINT::oct2point($group, $P, $buf, $ctx);
Crypt::OpenSSL::EC::EC_POINT::add($group, $P, $P, $Q, $ctx);

Crypt::OpenSSL::EC::EC_POINT::set_compressed_coordinates_GFp($group, $Q, $x, 1, $ctx));
my $bool = Crypt::OpenSSL::EC::EC_POINT::is_on_curve($group, $Q, $ctx));
Crypt::OpenSSL::EC::EC_POINT::copy($R, $P);
my $result = Crypt::OpenSSL::EC::EC_POINT::cmp($group, $P, $Q, $ctx);
Crypt::OpenSSL::EC::EC_POINT::set_affine_coordinates_GFp($group, $P, $x, $y, $ctx);
Crypt::OpenSSL::EC::EC_POINT::get_affine_coordinates_GFp($group, $P, $x, $y, $ctx);
Crypt::OpenSSL::EC::EC_GROUP::set_generator($group, $P, $z, Crypt::OpenSSL::Bignum->one());
my $degree = Crypt::OpenSSL::EC::EC_GROUP::get_degree($group)
my $order = Crypt::OpenSSL::EC::EC_GROUP::get_order($group, $order, $ctx);
Crypt::OpenSSL::EC::EC_POINT::mul($group, $Q, $order, $P, $n1, $ctx));
Crypt::OpenSSL::EC::EC_POINT::free($P);
Crypt::OpenSSL::EC::EC_GROUP::free($group);

🌸 DESCRIPTION 🌸

This module gives you a standard (non-OO) interface to the OpenSSL EC (Elliptic Curve) library. Some OO Calls are supported too, because we contain multitudes πŸ’…

Most of the functions described in openssl/ec.h? Supported. no cap.

It provides the Crypt::OpenSSL::EC class which defines some high level functions and constants. And it also provides 4 other classes for managing EC objects, and they are:

  • Crypt::OpenSSL::EC::EC_GROUP
  • Crypt::OpenSSL::EC::EC_POINT
  • Crypt::OpenSSL::EC::EC_KEY
  • Crypt::OpenSSL::EC::EC_METHOD

Every single object created by these 4 classes is implemented as a blessed Perl mortal reference. Why do we care? Because it means they get auto-destroyed the second the Perl variable becomes unreferenced β€” the appropriate EC free function will be called to free the underlying EC object. self-care era honestly 🧚

Even better, bestie: this means a bunch of the functions below can be called using O-O methods. If a method's first argument is the same as the class the method is in, then it can be called O-O style. For example, these following 2 calls are literally equivalent:

my $newgroup = Crypt::OpenSSL::EC::EC_GROUP::dup($group);
my $newgroup = $group->dup();

  • Crypt::OpenSSL::EC::EC_GFp_simple_method(); β€” Returns the basic GFp ec methods, which is the whole basis for the optimized methods. the founding mother 🫢
  • Crypt::OpenSSL::EC::EC_GFp_mont_method(); β€” Returns GFp methods using montgomery multiplication. slay.
  • Crypt::OpenSSL::EC::EC_GFp_nist_method(); β€” Returns GFp methods using optimized methods for NIST recommended curves ✨
  • Crypt::OpenSSL::EC::EC_GF2m_simple_method(); β€” Returns the basic GF2m ec method
    • ⚠️ Not available if OPENSSL_NO_EC2M is defined in OpenSSL.
  • Crypt::OpenSSL::EC::EC_GROUP::new($method); β€” Creates a new EC_GROUP object. $method is the method to use 🌱
  • Crypt::OpenSSL::EC::EC_GROUP::set_curve_GFp($group, $p, $a, $b, $ctx); β€” Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b
    • group β€” EC_GROUP object
    • p β€” BIGNUM with the prime number
    • a β€” BIGNUM with parameter a of the equation
    • b β€” BIGNUM with parameter b of the equation
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_GROUP::method_of($group); β€” Returns the EC_METHOD of the EC_GROUP object.
  • Crypt::OpenSSL::EC::EC_METHOD::get_field_type($method) β€” Returns the field type of the EC_METHOD.
  • Crypt::OpenSSL::EC::EC_GROUP::copy($dst, $src); β€” Copies EC_GROUP objects.
⚠️ Note: both EC_GROUPs must use the same EC_METHOD.
  • return β€” newly created EC_GROUP object or NULL in case of an error
  • Crypt::OpenSSL::EC::EC_GROUP::dup($src); β€” Creates a new EC_GROUP object and copies the copies the content form src to the newly created EC_GROUP object.
    • return β€” newly created EC_GROUP object or NULL in case of an error
  • Crypt::OpenSSL::EC::EC_GROUP::get_curve_GFp($group, $p, $a, $b, $ctx); β€” Gets the parameter of the ec over GFp defined by y^2 = x^3 + a*x + b
    • group β€” EC_GROUP object
    • p β€” BIGNUM for the prime number
    • a β€” BIGNUM for parameter a of the equation
    • b β€” BIGNUM for parameter b of the equation
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_GROUP::set_curve_GF2m($group, $p, $a, $b, $ctx); β€” Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
    • ⚠️ Not available if OPENSSL_NO_EC2M is defined in OpenSSL.
    • group β€” EC_GROUP object
    • p β€” BIGNUM with the polynomial defining the underlying field
    • a β€” BIGNUM with parameter a of the equation
    • b β€” BIGNUM with parameter b of the equation
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_GROUP::get_curve_GF2m($group, $p, $a, $b, $ctx); β€” Gets the parameter of the ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
    • ⚠️ Not available if OPENSSL_NO_EC2M is defined in OpenSSL.
    • group β€” EC_GROUP object
    • p β€” BIGNUM for the polynomial defining the underlying field
    • a β€” BIGNUM for parameter a of the equation
    • b β€” BIGNUM for parameter b of the equation
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::print_errs(); β€” (no description in the source, she's mysterious like that πŸ™ˆ)
  • Crypt::OpenSSL::EC::EC_POINT::new($group); β€” Creates a new EC_POINT object for the specified EC_GROUP
    • group β€” EC_GROUP the underlying EC_GROUP object
    • return β€” newly created EC_POINT object or NULL if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::free($point); β€” Frees a EC_POINT object
    • point β€” EC_POINT object to be freed
⚠️ This should normally not be called from Perl, since EC_POINT objects created by this library are auto-destroyed when they become unreferenced.
  • Crypt::OpenSSL::EC::EC_POINT::clear_free($point); β€” Clears and frees a EC_POINT object
    • point β€” EC_POINT object to be cleared and freed
⚠️ This should normally not be called from Perl, since EC_POINT objects created by this library are auto-destroyed when they become unreferenced.
  • Crypt::OpenSSL::EC::EC_POINT::copy($dst, $src); β€” Copies EC_POINT object
    • dst β€” destination EC_POINT object
    • src β€” source EC_POINT object
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::dup($src, $group); β€” Creates a new EC_POINT object and copies the content of the supplied EC_POINT
    • src β€” source EC_POINT object
    • group β€” underlying the EC_GROUP object
    • return β€” newly created EC_POINT object or NULL if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::set_to_infinity($group, $point); β€” Sets a point to infinity (neutral element) ♾️
    • group β€” underlying EC_GROUP object
    • point β€” EC_POINT to set to infinity
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::get_Jprojective_coordinates_GFp($group, $p, $x, $y, $z, $ctx); β€” Gets the jacobian projective coordinates of a EC_POINT over GFp
    • group β€” underlying EC_GROUP object
    • p β€” EC_POINT object
    • x β€” BIGNUM for the x-coordinate
    • y β€” BIGNUM for the y-coordinate
    • z β€” BIGNUM for the z-coordinate
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::set_affine_coordinates_GFp($group, $p, $x, $y, $ctx); β€” Sets the affine coordinates of a EC_POINT over GFp
    • group β€” underlying EC_GROUP object
    • p β€” EC_POINT object
    • x β€” BIGNUM with the x-coordinate
    • y β€” BIGNUM with the y-coordinate
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::get_affine_coordinates_GFp($group, $p, $x, $y, $ctx); β€” Gets the affine coordinates of a EC_POINT over GFp
    • group β€” underlying EC_GROUP object
    • p β€” EC_POINT object
    • x β€” BIGNUM for the x-coordinate
    • y β€” BIGNUM for the y-coordinate
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::set_compressed_coordinates_GFp($group, $p, $x, $y_bit, $ctx); β€” Sets the x9.62 compressed coordinates of a EC_POINT over GFp
    • group β€” underlying EC_GROUP object
    • p β€” EC_POINT object
    • x β€” BIGNUM with x-coordinate
    • y_bit β€” integer with the y-Bit (either 0 or 1)
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::set_affine_coordinates_GF2m($group, $p, $x, $y, $ctx); β€” Sets the affine coordinates of a EC_POINT over GF2m
    • ⚠️ Not available if OPENSSL_NO_EC2M is defined in OpenSSL.
    • group β€” underlying EC_GROUP object
    • p β€” EC_POINT object
    • x β€” BIGNUM with the x-coordinate
    • y β€” BIGNUM with the y-coordinate
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::get_affine_coordinates_GF2m($group, $p, $x, $y, $ctx); β€” Gets the affine coordinates of a EC_POINT over GF2m
    • ⚠️ Not available if OPENSSL_NO_EC2M is defined in OpenSSL.
    • group β€” underlying EC_GROUP object
    • p β€” EC_POINT object
    • x β€” BIGNUM for the x-coordinate
    • y β€” BIGNUM for the y-coordinate
    • ctx β€” BN_CTX object (optional)
    • return β€” 1 on success and 0 if an error occurred
  • Crypt::OpenSSL::EC::EC_POINT::set_compressed_coordinates_GF2m($group, $p, $x, $y_bit, $ctx);
    • ⚠️ Not available if OPENSSL_NO_EC2M is defined in OpenSSL.

okay so we're picking up mid-sentence because this function is that girl β€” she's the compressed-coordinates queen and she sets the x9.62 compressed coordinates of an EC_POINT over GF2m. here's her whole deal:

  • group β€” the underlying EC_GROUP object, the home base
  • p β€” the EC_POINT object
  • x β€” a BIGNUM with the x-coordinate
  • y_bit β€” an integer with the y-Bit (either 0 or 1, no in-between bestie)
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred 😭

🌸 Crypt::OpenSSL::EC::EC_POINT::is_at_infinity($group, $p);

checks whether the point is the neutral element of the group. very "am i the main character or am i nothing" energy:

  • group β€” the underlying EC_GROUP object
  • p β€” the EC_POINT object
  • returns 1 if the point is the neutral element and 0 otherwise

πŸ¦‹ Crypt::OpenSSL::EC::EC_POINT::point2oct($group, $p, $form, $ctx);

encodes an EC_POINT object into an octet string. it's giving "pack it up and send it":

  • group β€” the underlying EC_GROUP object
  • p β€” the EC_POINT object
  • form β€” point conversion form
  • ctx β€” a BN_CTX object (optional)
  • returns the encoded EC point ✨

πŸŽ€ Crypt::OpenSSL::EC::EC_POINT::oct2point($group, $p, $buf, $ctx);

the reverse slay β€” decodes an EC_POINT from an octet string:

  • group β€” the underlying EC_GROUP object
  • p β€” the EC_POINT object
  • buf β€” buffer with the encoded ec point
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

πŸ’… these four, back to back, no commentary in the original so no commentary from me:

Crypt::OpenSSL::EC::EC_POINT::point2bn($group, $p, $form, $bn, $ctx);
Crypt::OpenSSL::EC::EC_POINT::bn2point($group, $bn, $p, $ctx);
Crypt::OpenSSL::EC::EC_POINT::point2hex($group, $p, $form, $bn, $ctx);
Crypt::OpenSSL::EC::EC_POINT::hex2point($group, $bn, $p, $ctx);

(yes that's literally all she wrote β€” the manpage gives them zero description and I refuse to make one up 🫢)

πŸ”₯ Crypt::OpenSSL::EC::EC_POINT::add($group, $r, $a, $b, $ctx);

computes the sum of two EC_POINTs. math besties stay winning:

  • group β€” the underlying EC_GROUP object
  • r β€” EC_POINT object for the result (r = a + b)
  • a β€” EC_POINT object with the first summand
  • b β€” EC_POINT object with the second summand
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

⭐ Crypt::OpenSSL::EC::EC_POINT::dbl($group, $r, $a, $ctx);

computes the double of an EC_POINT. double it and give it to the next person:

  • group β€” the underlying EC_GROUP object
  • r β€” EC_POINT object for the result (r = 2 * a)
  • a β€” the EC_POINT object
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

🧚 Crypt::OpenSSL::EC::EC_POINT::invert($group, $a, $ctx);

computes the inverse of an EC_POINT:

  • group β€” the underlying EC_GROUP object
  • a β€” EC_POINT object to be inverted (it's used for the result as well β€” so she flips herself in place, icon behavior)
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

🌈 Crypt::OpenSSL::EC::EC_POINT::is_on_curve($group, $point, $ctx));

checks whether the point is on the curve β€” the ultimate vibe check, honestly:

  • group β€” the underlying EC_GROUP object
  • point β€” EC_POINT object to check
  • ctx β€” a BN_CTX object (optional)
  • returns 1 if point is on the curve and 0 otherwise
ngl, that signature ends in )); in the original and I'm not touching it. copy it exactly, bestie. πŸ’€

πŸ’œ Crypt::OpenSSL::EC::EC_POINT::cmp($group, $a, $b, $ctx);

compares two EC_POINTs. are they the same or are they different, we simply must know:

  • group β€” the underlying EC_GROUP object
  • a β€” first EC_POINT object
  • b β€” second EC_POINT object
  • ctx β€” a BN_CTX object (optional)
  • returns 0 if both points are equal and a value != 0 otherwise

πŸ™ˆ Crypt::OpenSSL::EC::EC_POINT::make_affine($group, $point, $ct);

πŸ™ˆ Crypt::OpenSSL::EC::EC_POINTs::make_affine

Not Implemented. that's it. that's the whole entry. don't come for me, I'm just the messenger 😭 (and yes, the param is spelled $ct in the original β€” preserving that fr fr.)

πŸ’€ Crypt::OpenSSL::EC::EC_POINTs::mul

Not Implemented. also nothing. mood.


πŸ‘‘ the EC_GROUP girlies

πŸ“ Crypt::OpenSSL::EC::EC_GROUP::set_generator($group, $generator, $order, $cofactor);

sets the generator and its order/cofactor of an EC_GROUP object:

  • group β€” EC_GROUP object
  • generator β€” EC_POINT object with the generator
  • order β€” the order of the group generated by the generator
  • cofactor β€” the index of the sub-group generated by the generator in the group of all points on the elliptic curve
  • returns 1 on success and 0 if an error occurred

✨ Crypt::OpenSSL::EC::EC_GROUP::get0_generator($group);

returns the generator of an EC_GROUP object.

  • group β€” EC_GROUP object

returns the currently used generator (possibly NULL).

πŸ¦‹ Crypt::OpenSSL::EC::EC_GROUP::get_degree($group)

returns the number of bits needed to represent a field element:

  • group β€” EC_GROUP object
  • returns the number of bits needed to represent a field element

🌸 Crypt::OpenSSL::EC::EC_GROUP::check($group, $ctx);

checks whether the parameters in the EC_GROUP define a valid ec group:

  • group β€” EC_GROUP object
  • ctx β€” a BN_CTX object (optional)
  • returns 1 if the group is a valid ec group and 0 otherwise

πŸŽ€ Crypt::OpenSSL::EC::EC_GROUP::check_discriminant($group, $ctx);

checks whether the discriminant of the elliptic curve is zero or not:

  • group β€” EC_GROUP object
  • ctx β€” a BN_CTX object (optional)
  • returns 1 if the discriminant is not zero and 0 otherwise

πŸ”₯ Crypt::OpenSSL::EC:: EC_GROUP::cmp($a, $b, $ctx);

compares two EC_GROUP objects. (and yep, that space in EC:: EC_GROUP is in the original β€” leaving it exactly where it lives, no cap.)

  • a β€” first EC_GROUP object
  • b β€” second EC_GROUP object
  • ctx β€” a BN_CTX object (optional)
  • returns 0 if both groups are equal and 1 otherwise

⭐ Crypt::OpenSSL::EC::EC::EC_GROUP::new_curve_GFp($p, $a, $b, $ctx);

creates a new EC_GROUP object with the specified parameters defined over GFp β€” and the equation is literally y^2 = x^3 + a*x + b, write it down bestie:

  • p β€” BIGNUM with the prime number
  • a β€” BIGNUM with the parameter a of the equation
  • b β€” BIGNUM with the parameter b of the equation
  • ctx β€” a BN_CTX object (optional)
  • returns a newly created EC_GROUP object with the specified parameters
and yes, the original really writes Crypt::OpenSSL::EC::EC::EC_GROUP with two ECs. doubling up, she's extra. copy it exactly. πŸ’…

🧚 Crypt::OpenSSL::EC::EC_GROUP::new_curve_GF2m($p, $a, $b, $ctx);

Not available if OPENSSL_NO_EC2M is defined in OpenSSL.

creates a new EC_GROUP object with the specified parameters defined over GF2m, defined by the equation y^2 + x*y = x^3 + a*x^2 + b:

  • p β€” BIGNUM with the polynomial defining the underlying field
  • a β€” BIGNUM with the parameter a of the equation
  • b β€” BIGNUM with the parameter b of the equation
  • ctx β€” a BN_CTX object (optional)
  • returns a newly created EC_GROUP object with the specified parameters

🌈 Crypt::OpenSSL::EC::EC_GROUP::new_by_curve_name($nid);

creates an EC_GROUP object with a curve specified by a NID:

  • nid β€” NID of the OID of the curve name
  • returns a newly created EC_GROUP object with the specified curve or NULL if an error occurred

πŸ’œ Crypt::OpenSSL::EC::EC_get_builtin_curves($r, $nitems);

so EC_builtin_curves(EC_builtin_curve *r, size_t size) returns the number of all available curves, or zero if an error occurred. and in case r is not zero, nitems EC_builtin_curve structures get filled with the data of the first nitems internal groups. built-in curve catalogue, basically. πŸ›οΈ

πŸ“ Crypt::OpenSSL::EC::EC_GROUP::get_order($group, $order, $ctx);

gets the order of an EC_GROUP:

  • group β€” EC_GROUP object
  • order β€” BIGNUM to which the order is copied
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

✨ Crypt::OpenSSL::EC::EC_GROUP::get_cofactor($group, $cofactopr, $ctx)

gets the cofactor of an EC_GROUP:

  • group β€” EC_GROUP object
  • cofactor β€” BIGNUM to which the cofactor is copied
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred
the signature says $cofactopr and the bullet says cofactor. that's the original, not me. πŸ€·β€β™€οΈ

πŸ¦‹ Crypt::OpenSSL::EC::EC_GROUP::set_curve_name($group, $nid);

sets the name of an EC_GROUP object:

  • group β€” EC_GROUP object
  • nid β€” NID of the curve name OID

🌸 Crypt::OpenSSL::EC::EC_GROUP::get_curve_name($group);

returns the curve name of an EC_GROUP object:

  • group β€” EC_GROUP object
  • returns the NID of the curve name OID or 0 if not set

πŸŽ€ Crypt::OpenSSL::EC::EC_GROUP::set_asn1_flag($group, $flag);

sets the ASN flag for the group.

πŸŽ€ Crypt::OpenSSL::EC::EC_GROUP::get_asn1_flag($group);

returns the ASN flag for the group.

πŸ”₯ Crypt::OpenSSL::EC::EC_GROUP::set_point_conversion_form($group, $form);

sets the point conversion form.

πŸ”₯ Crypt::OpenSSL::EC::EC_GROUP::get_point_conversion_form($group);

returns the point conversion form for the group.

⭐ Crypt::OpenSSL::EC::EC_GROUP::get0_seed($group);

returns the 0 seed.

⭐ Crypt::OpenSSL::EC::EC_GROUP::get_seed_len($group);

returns the seed length.

⭐ Crypt::OpenSSL::EC::EC_GROUP::set_seed($group, $seed);

sets the group seed.

πŸ’… Crypt::OpenSSL::EC::EC_POINT::mul($group, $r, $n, $q, $m, $ctx));

computes r = generator * n + q * m. multi-scalar mul, she's doing the most and we love her for it:

  • group β€” the underlying EC_GROUP object
  • r β€” EC_POINT object for the result
  • n β€” BIGNUM with the multiplier for the group generator (optional)
  • q β€” EC_POINT object with the first factor of the second summand
  • m β€” BIGNUM with the second factor of the second summand
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

🧚 Crypt::OpenSSL::EC::EC_GROUP::precompute_mult($group, $ctx);

stores multiples of the generator for faster point multiplication. she's doing the prep work so future-you can thrive:

  • group β€” EC_GROUP object
  • ctx β€” a BN_CTX object (optional)
  • returns 1 on success and 0 if an error occurred

🌈 Crypt::OpenSSL::EC::EC_GROUP::have_precompute_mult($group);

reports whether a precomputation has been done:

  • group β€” EC_GROUP object
  • returns 1 if a pre-computation has been done and 0 otherwise

πŸ’œ Crypt::OpenSSL::EC::EC_GROUP::get_basis_type($group);

EC_GROUP_get_basis_type() returns the NID of the basis type used to represent the field elements.

πŸ“ Crypt::OpenSSL::EC::EC_GROUP::get_trinomial_basis($group, $k);

Not available if OPENSSL_NO_EC2M is defined in OpenSSL.

πŸ“ Crypt::OpenSSL::EC:: EC_GROUP::get_pentanomial_basis($group, $k1, $k2, $k3);

Not available if OPENSSL_NO_EC2M is defined in OpenSSL.

again with the EC:: EC_GROUP space. it's a whole thing. keep it. πŸ™ˆ

✨ Crypt::OpenSSL::EC::EC_GROUP::free($group);

frees an EC_GROUP object. this should normally not be called from Perl, since EC_GROUP objects created by this library are auto-destroyed when they become unreferenced. so like… don't. she handles herself. πŸ’…

✨ Crypt::OpenSSL::EC::EC_GROUP::clear_free($group);

clears and frees an EC_GROUP object. same warning, bestie: this should normally not be called from Perl, since EC_GROUP objects created by this library are auto-destroyed when they become unreferenced.


πŸ”‘ and now the EC_KEY section

πŸ‘‘ Crypt::OpenSSL::EC::EC_KEY::new();

creates a new EC_KEY object. returns the EC_KEY object or NULL if an error occurred.

πŸ¦‹ Crypt::OpenSSL::EC::EC_KEY::new_by_curve_name($nid);

creates a new EC_KEY object using a named curve as the underlying EC_GROUP object:

  • nid β€” NID of the named curve
  • returns the EC_KEY object or NULL if an error occurred

πŸŽ€ Crypt::OpenSSL::EC::EC_KEY::free($key);

frees an EC_KEY object:

  • key β€” EC_KEY object to be freed. this should normally not be called from Perl, since EC_KEY objects created by this library are auto-destroyed when they become unreferenced.
ok that's the energy for this chunk β€” the auto-destroy squad is thriving and the "Not Implemented" girlies are still not implemented. more coming, don't go anywhere πŸ’–

Crypt::OpenSSL::EC::EC_KEY::copy($dst, $src); β€” bestie, this one literally copies a EC_KEY object. Duplicate era πŸ’…

  • dst β€” destination EC_KEY object
  • src β€” src EC_KEY object
  • return dst or NULL if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::dup($src); β€” makes a brand-new EC_KEY object and copies everything from src into it. it's giving fresh-start energy ✨

  • src β€” the source EC_KEY object
  • return newly created EC_KEY object or NULL if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::up_ref($key); β€” bumps the internal reference count of a EC_KEY object. keeping it alive, no cap 🫢

  • key β€” EC_KEY object
  • return 1 on success and 0 if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::get0_group($key); β€” hands you the EC_GROUP object of a EC_KEY object

  • key β€” EC_KEY object
  • \return the EC_GROUP object (possibly NULL).

Crypt::OpenSSL::EC::EC_KEY::set_group($key, $group); β€” sets the EC_GROUP of a EC_KEY object πŸŽ€

  • key β€” EC_KEY object
  • group β€” EC_GROUP to use in the EC_KEY object (note: the EC_KEY object will use an own copy of the EC_GROUP).
  • return 1 on success and 0 if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::set_private_key($key, $prv); β€” sets the private key of a EC_KEY object. secretive. mysterious. main character πŸ”₯

  • key β€” EC_KEY object
  • prv β€” BIGNUM with the private key (note: the EC_KEY object will use an own copy of the BIGNUM).
  • return 1 on success and 0 if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::get0_public_key($key); β€” returns the public key of a EC_KEY object. the loud one of the pair πŸ’–

  • key β€” the EC_KEY object
  • return a EC_POINT object with the public key (possibly NULL)

Crypt::OpenSSL::EC::EC_KEY::set_public_key($key, $pub); β€” sets the public key of a EC_KEY object

  • key β€” EC_KEY object
  • pub β€” EC_POINT object with the public key (note: the EC_KEY object will use an own copy of the EC_POINT object).
  • return 1 on success and 0 if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::get_enc_flags($key);

Crypt::OpenSSL::EC::EC_KEY::set_enc_flags($key, $flags);

Crypt::OpenSSL::EC::EC_KEY::get_conv_form($key)

Crypt::OpenSSL::EC::EC_KEY::set_conv_form($key, $form);

Crypt::OpenSSL::EC::EC_KEY::get_key_method_data β€” Not Implemented πŸ™ˆ

Crypt::OpenSSL::EC::EC_KEY::insert_key_method_data β€” Not Implemented πŸ™ˆ

Crypt::OpenSSL::EC::EC_KEY::set_asn1_flag($key, $flag);

Crypt::OpenSSL::EC::EC_KEY::precompute_mult($key, $ctx); β€” builds a whole table of pre-computed multiples of the generator so future EC_KEY operations go brrr ⚑

  • key β€” EC_KEY object
  • ctx β€” BN_CTX object (optional)
  • return 1 on success and 0 if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::generate_key($key); β€” creates a new ec private (and optional a new public) key. fresh keys just dropped πŸ‘‘

  • key β€” EC_KEY object
  • return 1 on success and 0 if an error occurred.

Crypt::OpenSSL::EC::EC_KEY::check_key($key); β€” vibe checks your private and/or public key to make sure it's actually valid πŸ’€

  • key β€” the EC_KEY object
  • return 1 on success and 0 otherwise.

🧚 EXPORT

None by default. nothing comes free, bestie.

🌈 Exportable constants

okay this is the motherlode β€” every single one of these is exportable, and yes we're listing all of them, because skipping is not the vibe:

EC_F_COMPUTE_WNAF
EC_F_D2I_ECPARAMETERS
EC_F_D2I_ECPKPARAMETERS
EC_F_D2I_ECPRIVATEKEY
EC_F_DO_EC_KEY_PRINT
EC_F_ECKEY_PARAM2TYPE
EC_F_ECKEY_PARAM_DECODE
EC_F_ECKEY_PRIV_DECODE
EC_F_ECKEY_PRIV_ENCODE
EC_F_ECKEY_PUB_DECODE
EC_F_ECKEY_PUB_ENCODE
EC_F_ECKEY_TYPE2PARAM
EC_F_ECPARAMETERS_PRINT
EC_F_ECPARAMETERS_PRINT_FP
EC_F_ECPKPARAMETERS_PRINT
EC_F_ECPKPARAMETERS_PRINT_FP
EC_F_ECP_NIST_MOD_192
EC_F_ECP_NIST_MOD_224
EC_F_ECP_NIST_MOD_256
EC_F_ECP_NIST_MOD_521
EC_F_EC_ASN1_GROUP2CURVE
EC_F_EC_ASN1_GROUP2FIELDID
EC_F_EC_ASN1_GROUP2PARAMETERS
EC_F_EC_ASN1_GROUP2PKPARAMETERS
EC_F_EC_ASN1_PARAMETERS2GROUP
EC_F_EC_ASN1_PKPARAMETERS2GROUP
EC_F_EC_EX_DATA_SET_DATA
EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY
EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT
EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE
EC_F_EC_GF2M_SIMPLE_OCT2POINT
EC_F_EC_GF2M_SIMPLE_POINT2OCT
EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES
EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES
EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES
EC_F_EC_GFP_MONT_FIELD_DECODE
EC_F_EC_GFP_MONT_FIELD_ENCODE
EC_F_EC_GFP_MONT_FIELD_MUL
EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE
EC_F_EC_GFP_MONT_FIELD_SQR
EC_F_EC_GFP_MONT_GROUP_SET_CURVE
EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP
EC_F_EC_GFP_NIST_FIELD_MUL
EC_F_EC_GFP_NIST_FIELD_SQR
EC_F_EC_GFP_NIST_GROUP_SET_CURVE
EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT
EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE
EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP
EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR
EC_F_EC_GFP_SIMPLE_MAKE_AFFINE
EC_F_EC_GFP_SIMPLE_OCT2POINT
EC_F_EC_GFP_SIMPLE_POINT2OCT
EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE
EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES
EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP
EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES
EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP
EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES
EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP
EC_F_EC_GROUP_CHECK
EC_F_EC_GROUP_CHECK_DISCRIMINANT
EC_F_EC_GROUP_COPY
EC_F_EC_GROUP_GET0_GENERATOR
EC_F_EC_GROUP_GET_COFACTOR
EC_F_EC_GROUP_GET_CURVE_GF2M
EC_F_EC_GROUP_GET_CURVE_GFP
EC_F_EC_GROUP_GET_DEGREE
EC_F_EC_GROUP_GET_ORDER
EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS
EC_F_EC_GROUP_GET_TRINOMIAL_BASIS
EC_F_EC_GROUP_NEW
EC_F_EC_GROUP_NEW_BY_CURVE_NAME
EC_F_EC_GROUP_NEW_FROM_DATA
EC_F_EC_GROUP_PRECOMPUTE_MULT
EC_F_EC_GROUP_SET_CURVE_GF2M
EC_F_EC_GROUP_SET_CURVE_GFP
EC_F_EC_GROUP_SET_EXTRA_DATA
EC_F_EC_GROUP_SET_GENERATOR
EC_F_EC_KEY_CHECK_KEY
EC_F_EC_KEY_COPY
EC_F_EC_KEY_GENERATE_KEY
EC_F_EC_KEY_NEW
EC_F_EC_KEY_PRINT
EC_F_EC_KEY_PRINT_FP
EC_F_EC_POINTS_MAKE_AFFINE
EC_F_EC_POINT_ADD
EC_F_EC_POINT_CMP
EC_F_EC_POINT_COPY
EC_F_EC_POINT_DBL
EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2Mg
EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP
EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP
EC_F_EC_POINT_INVERT
EC_F_EC_POINT_IS_AT_INFINITY
EC_F_EC_POINT_IS_ON_CURVE
EC_F_EC_POINT_MAKE_AFFINE
EC_F_EC_POINT_MUL
EC_F_EC_POINT_NEW
EC_F_EC_POINT_OCT2POINT
EC_F_EC_POINT_POINT2OCT
EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M
EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP
EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M
EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP
EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP
EC_F_EC_POINT_SET_TO_INFINITY
EC_F_EC_PRE_COMP_DUP
EC_F_EC_PRE_COMP_NEW
EC_F_EC_WNAF_MUL
EC_F_EC_WNAF_PRECOMPUTE_MULT
EC_F_I2D_ECPARAMETERS
EC_F_I2D_ECPKPARAMETERS
EC_F_I2D_ECPRIVATEKEY
EC_F_I2O_ECPUBLICKEY
EC_F_O2I_ECPUBLICKEY
EC_F_OLD_EC_PRIV_DECODE
EC_F_PKEY_EC_CTRL
EC_F_PKEY_EC_CTRL_STR
EC_F_PKEY_EC_DERIVE
EC_F_PKEY_EC_KEYGEN
EC_F_PKEY_EC_PARAMGEN
EC_F_PKEY_EC_SIGN
EC_PKEY_NO_PARAMETERS
EC_PKEY_NO_PUBKEY
EC_R_ASN1_ERROR
EC_R_ASN1_UNKNOWN_FIELD
EC_R_BUFFER_TOO_SMALL
EC_R_D2I_ECPKPARAMETERS_FAILURE
EC_R_DECODE_ERROR
EC_R_DISCRIMINANT_IS_ZERO
EC_R_EC_GROUP_NEW_BY_NAME_FAILURE
EC_R_FIELD_TOO_LARGE
EC_R_GROUP2PKPARAMETERS_FAILURE
EC_R_I2D_ECPKPARAMETERS_FAILURE
EC_R_INCOMPATIBLE_OBJECTS
EC_R_INVALID_ARGUMENT
EC_R_INVALID_COMPRESSED_POINT
EC_R_INVALID_COMPRESSION_BIT
EC_R_INVALID_CURVE
EC_R_INVALID_DIGEST_TYPE
EC_R_INVALID_ENCODING
EC_R_INVALID_FIELD
EC_R_INVALID_FORM
EC_R_INVALID_GROUP_ORDER
EC_R_INVALID_PENTANOMIAL_BASIS
EC_R_INVALID_PRIVATE_KEY
EC_R_INVALID_TRINOMIAL_BASIS
EC_R_KEYS_NOT_SET
EC_R_MISSING_PARAMETERS
EC_R_MISSING_PRIVATE_KEY
EC_R_NOT_A_NIST_PRIME
EC_R_NOT_A_SUPPORTED_NIST_PRIME
EC_R_NOT_IMPLEMENTED
EC_R_NOT_INITIALIZED
EC_R_NO_FIELD_MOD
EC_R_NO_PARAMETERS_SET
EC_R_PASSED_NULL_PARAMETER
EC_R_PKPARAMETERS2GROUP_FAILURE
EC_R_POINT_AT_INFINITY
EC_R_POINT_IS_NOT_ON_CURVE
EC_R_SLOT_FULL
EC_R_UNDEFINED_GENERATOR
EC_R_UNDEFINED_ORDER
EC_R_UNKNOWN_GROUP
EC_R_UNKNOWN_ORDER
EC_R_UNSUPPORTED_FIELD
EC_R_WRONG_ORDER
EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID
OPENSSL_ECC_MAX_FIELD_BITS
OPENSSL_EC_NAMED_CURVE
POINT_CONVERSION_COMPRESSED
POINT_CONVERSION_HYBRID
POINT_CONVERSION_UNCOMPRESSED

πŸ¦‹ SEE ALSO

  • Crypt::OpenSSL::Bignum
  • OpenSSL

🌸 AUTHOR

Mike McCauley, <mikem@airspayce.com>


Copyright (C) 2012 by Mike McCauley

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.14.2 or, at your option, any later version of Perl 5 you may have available.


and that's a wrap on the whole page, bestie πŸŽ€ this version came from perl v5.42.3, dated 2026-08-20, and it's the Crypt:...SL::EC(3pm) page β€” go forth and elliptic-curve your heart out πŸ’–βœ¨πŸ¦‹

πŸ“¦ where this page comes from