NAME
Crypt::NaCl::Sodium::scalarmult - Diffie-Hellman (Curve25519)
VERSION
version 0.03
SYNOPSIS
use Crypt::NaCl::Sodium qw( :utils );
my $crypto_scalarmult = Crypt::NaCl::Sodium->scalarmult();
my ($a_skey, $a_pkey, $a_shared_key, $a_key
$b_skey, $b_pkey, $b_shared_key, $b_key);
## Alice
########
# Alice generates secret key
$a_skey = $crypto_scalarmult->keygen();
# and computes the public key
$a_pkey = $crypto_scalarmult->base( $a_skey );
# ... and shares it with Bob
send_to( Bob => { public_key => $a_pkey } );
## Bob
########
# Bob generates his secret key
$b_skey = $crypto_scalarmult->keygen();
# and computes the public key
$b_pkey = $crypto_scalarmult->base( $b_skey );
# ... and shares his public key with Alice
send_to( Alice => { public_key => $b_pkey } );
# Bob receives the public key from Alice
$a_key = receive_for( Bob => 'public_key' );
# Bob can now calculate the shared secret key
$b_shared_key = $crypto_scalarmult->shared_secret( $b_skey, $a_key );
## Alice
########
# Alice receives the public key from Bob
$b_key = receive_for( Alice => 'public_key' );
# and can now also calculate the shared secret key
$a_shared_key = $crypto_scalarmult->shared_secret( $a_skey, $b_key );
# shared keys calculated by Alice and Bob are equal
$a_shared_key eq $b_shared_key or die;
# NOTE: send_to() and receive_for() and user functions providing transport of
# messages
DESCRIPTION
crypto_scalarmult
provides Curve25519, a state-of-the-art Diffie-Hellman function suitable for a wide variety of applications, eg. authenticate and encrypt messages between both parties.
METHODS
keygen
my $secret_key = $crypto_scalarmult->keygen();
Helper method to generate a random secret key to be used by $crypto_scalarmult
.
The length of the $secret_key
equals "SCALARBYTES".
The same secret key can be used with multiple other users, without the need of generating a distinct set of keys.
NOTE: keep the secret key confidential.
Returns Data::BytesLocker objects.
base
my $public_key = $crypto_scalarmult->base( $secret_key );
Computes the public key for corresponding secret key.
The length of the $public_key
equals "BYTES".
Returns Data::BytesLocker objects.
shared_secret
my $shared_key = $crypto_scalarmult->shared_secret( $sender_secret_key, $recipient_public_key );
Given a user's secret key $sender_secret_key
and another user's public key $recipient_public_key
, computes a secret shared by the two users and returns it. This secret can then be used to authenticate and encrypt messages between the two users.
The length of the $shared_key
equals "BYTES".
Returns Data::BytesLocker objects.
CONSTANTS
BYTES
and SCALARBYTES
are provided for consistency, but it is safe to assume that BYTES == SCALARBYTES
.
BYTES
my $pkey_length = $crypto_scalarmult->BYTES;
Returns the length of public key (and shared secret).
SCALARBYTES
my $skey_length = $crypto_scalarmult->SECRETKEYBYTES;
Returns the length of secret key.
ALGORITHM DETAILS
crypto_scalarmult
uses Curve25519.
SEE ALSO
Data::BytesLocker - guarded data storage
A state-of-the-art Diffie-Hellman function - Curve25519
AUTHOR
Alex J. G. Burzyński <ajgb@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by Alex J. G. Burzyński <ajgb@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.