NAME
Crypt::Sodium::XS::OO::scalarmult - Point-scalar multiplication over the edwards25519 curve
SYNOPSIS
use Crypt::Sodium::XS 'sodium_random_bytes';
my $scalarmult = Crypt::Sodium::XS->scalarmult;
my $keysize = Crypt::Sodium::XS->box->SECRETKEYBYTES;
my $client_sk = sodium_random_bytes($keysize);
my $client_pk = $scalarmult->base($client_sk);
my $server_sk = sodium_random_bytes($keysize);
my $server_pk = $scalarmult->base($client_sk);
# !!! do not use output directly for key exchange; use Crypt::Sodium::XS::kx.
# if you really want to, you can manually do this:
# client side:
my $q = $scalarmult->scalarmult($client_sk, $server_pk);
my $hasher = Crypt::Sodium::XS->generichash->init;
$hasher->update($q, $client_pk, $server_pk);
my $client_shared_secret = $hasher->final;
# server side:
my $q = $scalarmult->scalarmult($server_sk, $client_pk);
my $hasher = Crypt::Sodium::XS->generichash->init;
$hasher->update($q, $client_pk, $server_pk);
my $server_shared_secret = $hasher->final;
# $client_shared_secret and $server_shared_secret are now identical keys.
DESCRIPTION
Crypt::Sodium::XS::scalarmult provides an API to multiply a point on the edwards25519 curve.
This can be used as a building block to construct key exchange mechanisms, or more generally to compute a public key from a secret key. For key exchange, you generally want to use Crypt::Sodium::XS::kx instead.
CONSTRUCTOR
new
my $scalarmult = Crypt::Sodium::XS::OO::scalarmult->new;
my $pwhash = Crypt::Sodium::XS->scalarmult;
Returns a new scalarmult object.
METHODS
BYTES
my $out_size = $scalarmult->BYTES
SCALARBYTES
my $out_size = $scalarmult->SCALARBYTES
keygen
my $secret_key = $scalarmult->keygen;
Generates a new random secret key. Returns $secret_key
as a Crypt::Sodium::XS::MemVault.
base
my $public_key = $scalarmult->base($secret_key);
Given a user’s $secret_key
, return the user’s public key.
Multiplies the base point (x, 4/5) by a scalar $secret_key
(clamped) and returns the Y coordinate of the resulting point.
NOTE: With the ed25519 primitive, a $secret_key
of 0 will croak.
scalarmult
my $q = $scalarmult->scalarmult($my_secret_key, $their_public_key);
This method can be used to compute a shared secret $q
given a user’s $my_secret_key
and another user’s $their_public_key
.
NOTE:
$q
represents the X coordinate of a point on the curve. As a result, the number of possible keys is limited to the group size (≈2^252), which is smaller than the key space.
For this reason, and to mitigate subtle attacks due to the fact many (p, n) pairs produce the same result, using the output of the multiplication q directly as a shared key is not recommended.
A better way to compute a shared key is h(q | pk1 | pk2), with pk1 and pk2 being the public keys.
By doing so, each party can prove what exact public key they intended to perform a key exchange with (for a given public key, 11 other public keys producing the same shared secret can be trivially computed).
See "SYNOPSIS" for an example of this.
ed225519 notes ($secret_key
is 'n', $public_key
is 'p'):
NOTE: With the ed25519 primitive, this function will croak if $my_secret_key
is 0 or if $their_public_key
is not on the curve, not on the main subgroup, is a point of small order, or is not provided in canonical form.
$my_secret_key
is “clamped” (the 3 low bits are cleared to make it a multiple of the cofactor, bit 254 is set and bit 255 is cleared to respect the original design).
SCALAR MULTIPLICATION WITHOUT CLAMPING
In order to prevent attacks using small subgroups, the scalarmult functions above clear lower bits of the scalar ($secret_key
). This may be indesirable to build protocols that requires $secret_key
to be invertible.
The noclamp variants of these functions do not clear these bits, and do not set the high bit either. These variants expect a scalar in the ]0..L[ range.
These methods are only available for the ed25519 primitive.
scalarmult_ed2551_base_noclamp
scalarmult_ed2551_noclamp
SEE ALSO
- Crypt::Sodium::XS
- Crypt::Sodium::XS::scalarmult
- https://doc.libsodium.org/advanced/scalar_multiplication
FEEDBACK
For reporting bugs, giving feedback, submitting patches, etc. please use the following:
RT queue at https://rt.cpan.org/Dist/Display.html?Name=Crypt-Sodium-XS
IRC channel
#sodium
onirc.perl.org
.Email the author directly.
For any security sensitive reports, please email the author directly or contact privately via IRC.
AUTHOR
Brad Barden <perlmodules@5c30.org>
COPYRIGHT & LICENSE
Copyright (c) 2022 Brad Barden. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.