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