• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

lib/Crypt/H05-Apr-2017-29059

t/H05-Apr-2017-332233

xt/H05-Apr-2017-8254

ChangesH A D05-Apr-2017730 2719

Curve25519.xsH A D05-Apr-20171.1 KiB4940

INSTALLH A D05-Apr-2017982 4524

LICENSEH A D05-Apr-201718 KiB380292

MANIFESTH A D05-Apr-2017530 2928

META.jsonH A D05-Apr-201717.1 KiB538536

META.ymlH A D05-Apr-201710.8 KiB395394

Makefile.PLH A D05-Apr-2017412 1511

READMEH A D05-Apr-20175.9 KiB185134

curve25519-donna-c64.cH A D05-Apr-201713.2 KiB450310

curve25519-donna-license.mdH A D05-Apr-20172 KiB4736

curve25519-donna.cH A D05-Apr-201726.6 KiB735529

typemapH A D05-Apr-201795 64

README

1NAME
2    Crypt::Curve25519 - Generate shared secret using elliptic-curve
3    Diffie-Hellman function
4
5VERSION
6    version 0.06
7
8SYNOPSIS
9        use Crypt::Curve25519;
10
11        # Alice:
12        my $alice_secret_key = curve25519_secret_key(random_32_bytes());
13        my $alice_public_key = curve25519_public_key( $alice_secret_key );
14
15        # Bob:
16        my $bob_secret_key = curve25519_secret_key(random_32_bytes());
17        my $bob_public_key = curve25519_public_key( $bob_secret_key );
18
19        # Alice and Bob exchange their public keys
20        my $alice_public_key_hex = unpack('H64', $alice_public_key);
21        my $bob_public_key_hex   = unpack('H64', $bob_public_key);
22
23        # Alice calculates shared secret to communicate with Bob
24        my $shared_secret_with_bob = curve25519_shared_secret(
25            $alice_secret_key,
26            pack('H64', $bob_public_key_hex)
27        );
28
29        # Bob calculates shared secret to communicate with Alice
30        my $shared_secret_with_alice = curve25519_shared_secret(
31            $bob_secret_key,
32            pack('H64', $alice_public_key_hex)
33        );
34
35        # Shared secrets are equal
36        die "Something horrible has happend!"
37          unless $shared_secret_with_bob eq $shared_secret_with_alice;
38
39    This package provides also simplified OO interface:
40
41        use Crypt::Curve25519 ();
42
43        my $c = Crypt::Curve25519->new();
44
45        # Alice:
46        my $alice_secret_key_hex = $c->secret_key(random_hexencoded_32_bytes());
47        my $alice_public_key_hex = $c->public_key( $alice_secret_key_hex );
48
49        # Bob:
50        my $bob_secret_key_hex = $c->secret_key(random_hexencoded_32_bytes());
51        my $bob_public_key_hex = $c->public_key( $bob_secret_key_hex );
52
53        # Alice and Bob exchange their public keys
54
55        # Alice calculates shared secret to communicate with Bob
56        my $shared_secret_with_bob_hex = $c->shared_secret(
57                                        $alice_secret_key_hex,
58                                        $bob_public_key_hex);
59
60        # Bob calculates shared secret to communicate with Alice
61        my $shared_secret_with_alice_hex = $c->shared_secret(
62                                        $bob_secret_key_hex,
63                                        $alice_public_key_hex);
64
65        # Shared secrets are equal
66        die "Something horrible has happend!"
67          unless $shared_secret_with_bob_hex eq $shared_secret_with_alice_hex;
68
69    Example functions to generate pseudo-random private secret key:
70
71        sub random_32_bytes {
72            return join('', map { chr(int(rand(255))) } 1 .. 32);
73        }
74
75        sub random_hexencoded_32_bytes {
76           return unpack('H64', random_32_bytes());
77        }
78
79DESCRIPTION
80    Curve25519 is a state-of-the-art Diffie-Hellman function suitable for a
81    wide variety of applications.
82
83    Given a user's 32-byte secret key, Curve25519 computes the user's
84    32-byte public key. Given the user's 32-byte secret key and another
85    user's 32-byte public key, Curve25519 computes a 32-byte secret shared
86    by the two users. This secret can then be used to authenticate and
87    encrypt messages between the two users.
88
89METHODS
90  new
91        my $c = Crypt::Curve25519->new();
92
93    Create a new object
94
95  secret_key
96        my $my_secret_key_hex = $c->secret_key( $my_random_32byte_string_hex );
97
98    Using hex encoded 32-byte random string from cryptographically safe
99    source create masked secret key.
100
101  public_key
102        my $public_key_hex = $c->public_key( $my_secret_key_hex );
103
104    Using hex encoded masked secret key generate corresponding hex encoded
105    32-byte Curve25519 public key.
106
107  shared_secret
108        my $shared_secret_hex = $c->shared_secret(
109            $my_secret_key_hex, $his_public_key_hex
110        );
111
112    Using provided hex encoded keys generate 32-byte hex encoded shared
113    secret, that both parties can use without disclosing their private
114    secret keys.
115
116  generate
117    Access to primitive method is also provided.
118
119        my $key_hex = $c->generate($my_secret_key_hex, $basepoint_hex);
120
121        # public key
122        if ( $basepoint_hex eq unpack("H64", pack("H64", "09")) ) {
123            print "\$key_hex is a public key\n";
124        }
125        elsif ( $basepoint_hex eq $his_public_key_hex ) {
126            print "\$key_hex is a shared secret\n";
127        }
128
129    Using provided hex encoded secret key and depending on the 32-byte hex
130    encoded basepoint generate 32-byte hex encoded public key or shared
131    secret.
132
133FUNCTIONS
134  curve25519_secret_key
135        my $my_secret_key = curve25519_secret_key($my_random_32byte_string);
136
137    Using provided 32-byte random string from cryptographically safe source
138    create masked secret key.
139
140  curve25519_public_key
141        my $public_key = curve25519_public_key($my_secret_key);
142
143    Using masked secret key generate corresponding 32-byte Curve25519 public
144    key.
145
146  curve25519_shared_secret
147        my $shared_secret = curve25519_shared_secret(
148            $my_secret_key, $his_public_key
149        );
150
151    Using provided keys generate 32-byte shared secret, that both parties
152    can use without disclosing their private secret keys.
153
154  curve25519
155    Access to primitive function is also provided.
156
157        use Crypt::Curve25519 'curve25519';
158
159        my $key = curve25519($my_secret_key, $basepoint);
160
161        # public key
162        if ( $basepoint eq pack('H64', '09') ) {
163            print "\$key is a public key\n";
164        }
165        elsif ( $basepoint eq $his_public_key ) {
166            print "\$key is a shared secret\n";
167        }
168
169    Using provided secret key and depending on the 32-byte basepoint
170    generate 32-byte public key or shared secret.
171
172SEE ALSO
173    *   <http://cr.yp.to/ecdh.html>
174
175AUTHOR
176    Alex J. G. Burzyński <ajgb@cpan.org>
177
178COPYRIGHT AND LICENSE
179    This software is copyright (c) 2014 by Alex J. G. Burzyński
180    <ajgb@cpan.org>.
181
182    This is free software; you can redistribute it and/or modify it under
183    the same terms as the Perl 5 programming language system itself.
184
185