++ed by:
1 non-PAUSE user
Author image Alex J. G. Burzyński

NAME

Crypt::NaCl::Sodium::scalarmult - Diffie-Hellman (Curve25519)

VERSION

version 1.0.8.0

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

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.