agl / curve25519-donna

Implementations of a fast Elliptic-curve Diffie-Hellman primitive

This URL has Read+Write access

name age message
file Makefile Sun Mar 08 14:12:25 -0700 2009 Remove x86-64 version. With GCC 4.3, donna-c64... [Adam Langley]
file README Wed Aug 20 10:43:57 -0700 2008 Initial import [agl]
file curve25519-donna-c64.c Sun Mar 15 17:33:37 -0700 2009 c64: add additional step to carry chains Thank... [Adam Langley]
file curve25519-donna.c Mon Sep 15 14:59:16 -0700 2008 donna: final copy of the API change Masking an... [agl]
file speed-curve25519.c Wed Aug 20 14:14:45 -0700 2008 Fix a couple of warnings and some typos in the ... [agl]
file test-curve25519.c Wed Aug 20 14:17:10 -0700 2008 Fix warning in test-curve25519 [agl]
file test-sc-curve25519.c Wed Aug 20 14:12:19 -0700 2008 x86-64: Add a test for constant timing [agl]
file test-sc-curve25519.s Wed Aug 20 14:12:19 -0700 2008 x86-64: Add a test for constant timing [agl]
README
See http://code.google.com/p/curve25519-donna/ for details.

BUILDING:

If you run `make`, two .a archives will be built, similar to djb's curve25519
code. Alternatively, read on:

The C implementation is contained within curve25519-donna.c. It has no external
dependancies and is BSD licenced. You can copy/include/link it directly in with
your program. Recommended C flags: -O2

The x86-64 bit implementation is contained within curve25519-donna-x86-64.c and
curve25519-donna-x86-64.s. Build like this:

% cpp curve25519-donna-x86-64.s > curve25519-donna-x86-64.s.pp
% as -o curve25519-donna-x86-64.s.o curve25519-donna-x86-64.s.pp
% gcc -O2 -c curve25519-donna-x86-64.c

Then the two .o files can be linked in

USAGE:

The usage is exactly the same as djb's code (as described at
http://cr.yp.to/ecdh.html) expect that the function is called curve25519_donna.

In short,

To generate a private key, generate 32 random bytes and:

  mysecret[0] &= 248;
  mysecret[31] &= 127;
  mysecret[31] |= 64;

To generate the public key, just do

  static const uint8_t basepoint[32] = {9};
  curve25519_donna(mypublic, mysecret, basepoint);

To generate an agreed key do:
  uint8_t shared_key[32];
  curve25519_donna(shared_key, mysecret, theirpublic);

And hash the shared_key with a cryptographic hash function before using.