2013-04-25 23:43:19 -07:00
[![Build Status ](https://travis-ci.org/jedisct1/libsodium.png?branch=master )](https://travis-ci.org/jedisct1/libsodium?branch=master)
2013-01-31 00:25:02 -07:00
![libsodium ](https://raw.github.com/jedisct1/libsodium/master/logo.png )
2013-01-31 00:16:54 -07:00
============
2013-01-20 01:03:34 -07:00
2013-01-20 17:56:17 -07:00
[NaCl ](http://nacl.cr.yp.to/ ) (pronounced "salt") is a new easy-to-use
high-speed software library for network communication, encryption,
decryption, signatures, etc.
2013-01-20 01:03:34 -07:00
2013-01-20 17:56:17 -07:00
NaCl's goal is to provide all of the core operations needed to build
higher-level cryptographic tools.
2013-04-27 13:26:40 -07:00
Sodium is a portable, cross-compilable, installable, packageable
2013-10-28 01:24:44 -07:00
fork of NaCl (based on the latest released upstream version [nacl-20110221 ](http://hyperelliptic.org/nacl/nacl-20110221.tar.bz2 )), with a compatible API.
2013-01-20 17:56:17 -07:00
2013-09-09 21:25:31 -07:00
## Is it full of NSA backdoors?
![No NIST ](http://i.imgur.com/HSxeAmp.png )
The design of Sodium's primitives is completely free from NIST (and by
association, NSA) influence, with the following minor exceptions:
- The Poly1305 MAC, used for authenticating integrity of ciphertexts,
uses AES as a replaceable component,
- The Ed25519 digital signature algorithm uses SHA-512 for both key
derivation and computing message digests,
- APIs are provided to SHA-512 and SHA-512/256, but are replaceable by
2013-09-09 21:27:24 -07:00
the Blake2 hash function, which the Sodium library also provides.
2013-09-09 21:25:31 -07:00
The design choices, particularly in regard to the Curve25519
2013-09-19 13:21:35 -07:00
Diffie-Hellman function, emphasize security (whereas NIST curves
2013-09-09 21:25:31 -07:00
emphasize "performance" at the cost of security), and "magic
constants" in NaCl/Sodium are picked by theorems designed to maximize
security.
The same cannot be said of NIST curves, where the specific origins of
certain constants are not described by the standards and may be
subject to malicious influence by the NSA.
And despite the emphasis on higher security, primitives are faster
across-the-board than most implementations of the NIST standards.
2013-01-21 21:34:14 -07:00
## Portability
2013-01-20 17:56:17 -07:00
In order to pick the fastest working implementation of each primitive,
NaCl performs tests and benchmarks at compile-time. Unfortunately, the
2013-03-06 20:46:09 -07:00
resulting library is not guaranteed to work on different hardware.
2013-01-20 17:56:17 -07:00
2013-04-26 22:04:36 -07:00
Sodium performs tests at run-time, so that the same binary package can
still run everywhere.
2013-01-20 17:56:17 -07:00
Sodium is tested on a variety of compilers and operating systems,
2013-10-21 22:25:33 -07:00
including Windows (with MingW or Visual Studio, x86 and x64), iOS and Android.
2013-01-20 17:56:17 -07:00
2013-01-21 21:34:14 -07:00
## Installation
2013-01-20 17:56:17 -07:00
2013-03-06 20:46:09 -07:00
Sodium is a shared library with a machine-independent set of
2013-01-20 17:56:17 -07:00
headers, so that it can easily be used by 3rd party projects.
The library is built using autotools, making it easy to package.
Installation is trivial, and both compilation and testing can take
2013-01-21 21:34:14 -07:00
advantage of multiple CPU cores.
2013-01-21 22:33:39 -07:00
Download a
2013-07-07 14:04:52 -07:00
[tarball of libsodium ](https://download.libsodium.org/libsodium/releases/ ),
2013-01-21 21:34:14 -07:00
then follow the ritual:
2013-01-20 17:56:17 -07:00
./configure
2013-01-21 12:32:34 -07:00
make & & make check & & make install
2013-01-20 17:56:17 -07:00
2013-05-01 22:11:08 -07:00
Pre-compiled Win32 packages are available for download at the same
location.
2013-07-05 04:15:22 -07:00
Integrity of source tarballs can currently be checked using PGP or
verified DNS queries (`dig +dnssec +short txt < file > .download.libsodium.org`
returns the SHA256 of any file available for download).
2013-10-27 22:00:53 -07:00
## Pre-built binaries
Pre-built libraries for Visual studio 2010, 2012 and 2013, both for
x86 and x64, are available for download at
https://download.libsodium.org/libsodium/releases/ , courtesy of
Samuel Neves (@sneves).
2013-01-20 17:56:17 -07:00
## Comparison with vanilla NaCl
2013-01-20 17:57:26 -07:00
Sodium does not ship C++ bindings. These might be part of a distinct
package.
2013-01-20 17:56:17 -07:00
The default public-key signature system in NaCl was a prototype that
shouldn't be used any more.
Sodium ships with the SUPERCOP reference implementation of
[Ed25519 ](http://ed25519.cr.yp.to/ ), and uses this system by default
for `crypto_sign*` operations.
For backward compatibility, the previous system is still compiled in,
as `crypto_sign_edwards25519sha512batch*` .
## Additional features
The Sodium library provides some convenience functions in order to retrieve
2013-03-31 15:22:43 -07:00
the current version of the package and of the shared library:
2013-01-20 17:56:17 -07:00
const char *sodium_version_string(void);
2013-03-31 15:22:43 -07:00
const int sodium_library_version_major(void);
const int sodium_library_version_minor(void);
2013-01-20 17:56:17 -07:00
Headers are installed in `${prefix}/include/sodium` .
A convenience header includes everything you need to use the library:
#include < sodium.h >
2013-01-20 13:10:51 -07:00
2013-11-20 15:06:17 -07:00
This is not required, however, before any other libsodium function, it
is recommended to call:
2013-04-18 05:27:20 -07:00
2013-04-18 10:14:10 -07:00
sodium_init();
2013-04-18 05:27:20 -07:00
2013-04-23 14:18:45 -07:00
This will pick optimized implementations of some primitives, if they
appear to work as expected after running some tests, and these will be
2013-11-20 15:06:17 -07:00
used for subsequent operations.
It will also initialize the pseudorandom number generator.
This function should only be called once, and before performing any other
operations.
Doing so is required to ensure thread safety of all the functions provided by
the library.
2013-04-19 05:19:23 -07:00
2013-01-21 15:15:23 -07:00
Sodium also provides helper functions to generate random numbers,
leveraging `/dev/urandom` or `/dev/random` on *nix and the cryptographic
service provider on Windows. The interface is similar to
2013-04-26 09:55:47 -07:00
`arc4random(3)` . It is `fork(2)` -safe but not thread-safe. This holds
2013-04-26 17:27:55 -07:00
true for `crypto_sign_keypair()` and `crypto_box_keypair()` as well.
2013-01-21 15:15:23 -07:00
uint32_t randombytes_random(void);
Return a random 32-bit unsigned value.
void randombytes_stir(void);
Generate a new key for the pseudorandom number generator. The file
descriptor for the entropy source is kept open, so that the generator
can be reseeded even in a chroot() jail.
uint32_t randombytes_uniform(const uint32_t upper_bound);
Return a value between 0 and upper_bound using a uniform distribution.
void randombytes_buf(void * const buf, const size_t size);
Fill the buffer `buf` with `size` random bytes.
int randombytes_close(void);
Close the file descriptor or the handle for the cryptographic service
provider.
A custom implementation of these functions can be registered with
`randombytes_set_implementation()` .
2013-01-21 20:57:11 -07:00
2013-03-18 21:40:16 -07:00
In addition, Sodium provides a function to securely wipe a memory
region:
void sodium_memzero(void * const pnt, const size_t size);
Warning: if a region has been allocated on the heap, you still have
to make sure that it can't get swapped to disk, possibly using
`mlock(2)` .
2013-07-07 23:38:14 -07:00
In order to compare memory zones in constant time, Sodium provides:
2013-04-23 14:18:45 -07:00
int sodium_memcmp(const void * const b1_, const void * const b2_,
size_t size);
2013-10-30 06:47:13 -07:00
`sodium_memcmp()` returns `0` if `size` bytes at `b1_` and `b2_` are
equal, another value if they are not. Unlike `memcmp()` ,
`sodium_memcmp()` cannot be used to put `b1_` and `b2_` into a defined
order.
2013-07-07 23:38:14 -07:00
And a convenience function for converting a binary buffer to a
hexadecimal string:
char * sodium_bin2hex(char * const hex, const size_t hexlen,
const unsigned char *bin, const size_t binlen);
2013-04-23 14:18:45 -07:00
## New operations
### crypto_shorthash
A lot of applications and programming language implementations have
been recently found to be vulnerable to denial-of-service attacks when
a hash function with weak security guarantees, like Murmurhash 3, was
used to construct a hash table.
In order to address this, Sodium provides the “shorthash” function,
currently implemented using SipHash-2-4. This very fast hash function
outputs short, but unpredictable (without knowing the secret key)
values suitable for picking a list in a hash table for a given key.
See `crypto_shorthash.h` for details.
### crypto_generichash
This hash function provides:
* A variable output length (up to `crypto_generichash_BYTES_MAX` bytes)
* A variable key length (from no key at all to
`crypto_generichash_KEYBYTES_MAX` bytes)
* A simple interface as well as a streaming interface.
`crypto_generichash` is currently being implemented using
[Blake2 ](https://blake2.net/ ).
## Constants available as functions
In addition to constants for key sizes, output sizes and block sizes,
Sodium provides these values through function calls, so that using
them from different languages is easier.
2013-01-21 20:57:11 -07:00
## Bindings for other languages
2013-04-27 23:59:51 -07:00
* Erlang: [Erlang-NaCl ](https://github.com/tonyg/erlang-nacl )
2013-11-11 09:22:52 -07:00
* Erlang: [Salt ](https://github.com/freza/salt )
2013-06-06 00:24:55 -07:00
* Haskell: [Saltine ](https://github.com/tel/saltine )
2013-11-05 00:00:02 -07:00
* Idris: [Idris-Sodium ](https://github.com/jfdm/idris-sodium )
2013-03-30 21:55:45 -07:00
* Java: [Kalium ](https://github.com/abstractj/kalium )
2013-07-16 14:14:58 -07:00
* Java JNI: [Kalium-JNI ](https://github.com/joshjdevl/kalium-jni )
2013-04-24 07:25:34 -07:00
* Julia: [Sodium.jl ](https://github.com/amitmurthy/Sodium.jl )
2013-09-30 13:52:30 -07:00
* .NET: [libsodium-net ](https://github.com/adamcaudill/libsodium-net )
2013-11-11 10:34:51 -07:00
* NodeJS: [node-sodium ](https://github.com/paixaop/node-sodium )
2013-07-10 00:25:55 -07:00
* Ocaml: [ocaml-sodium ](https://github.com/dsheets/ocaml-sodium )
2013-06-17 23:13:42 -07:00
* Pharo/Squeak: [Crypto-NaCl ](http://www.eighty-twenty.org/index.cgi/tech/smalltalk/nacl-for-squeak-and-pharo-20130601.html )
2013-06-15 09:03:04 -07:00
* PHP: [PHP-Sodium ](https://github.com/alethia7/php-sodium )
2013-11-11 22:16:45 -07:00
* PHP: [libsodium-php ](https://github.com/jedisct1/libsodium-php )
2013-04-27 23:59:51 -07:00
* Python: [PyNaCl ](https://github.com/dstufft/pynacl )
2013-08-25 23:12:59 -07:00
* Python: [PySodium ](https://github.com/stef/pysodium )
2013-04-27 23:59:51 -07:00
* Racket: part of [CRESTaceans ](https://github.com/mgorlick/CRESTaceans/tree/master/bindings/libsodium )
* Ruby: [RbNaCl ](https://github.com/cryptosphere/rbnacl )
* Ruby: [Sodium ](https://github.com/stouset/sodium )
2013-01-21 20:57:11 -07:00
2013-03-17 23:22:40 -07:00
## CurveCP
CurveCP tools are part of a different project,
2013-04-27 10:46:11 -07:00
[libchloride ](https://github.com/jedisct1/libchloride ).
If you are interested in an embeddable CurveCP implementation, take a
look at [libcurvecpr ](https://github.com/impl/libcurvecpr ).
2013-03-17 23:22:40 -07:00
2013-02-23 16:21:45 -07:00
## Mailing list
A mailing-list is available to discuss libsodium.
In order to join, just send a random mail to `sodium-subscribe` {at}
2013-02-23 16:22:53 -07:00
`pureftpd` {dot}`org`.
2013-07-29 09:37:42 -07:00
## License
[ISC license ](http://en.wikipedia.org/wiki/ISC_license ).
See the `COPYING` file for details, `AUTHORS` for designers and
implementors, and `THANKS` for contributors.