<div dir="ltr">Hi Erlangers,<div><br></div><div>NaCl is a cryptographic library by Dan J. Bernstein, Tanja Lange and Peter Schwabe. Libsodium is a portable implementation of NaCl by Frank Denis.</div><div><br></div><div>Cryptographic systems are hard to get right. You have to beware of timing attacks in your low level primitives, so you can't use timing to attack the code. Also, even if you manage to get the primitives correct, you can still miss by using the primitives incorrectly. NaCl/libsodium avoids the first by:</div><div><br></div><div>* Having no flow from the secret to load addresses. In particular, it avoids large lookup tables which can be attacked by cache timings.</div><div><br></div><div>* Having no flow secret to branch conditions. This avoids timing attacks where one measures what branches were taken in the code.</div><div><br></div><div>* Having protection against padding oracle side channel attacks.</div><div><br></div><div>* Using a standardized RNG from the operting system.</div><div><br></div><div>* Avoiding primitives that require randomness as much as possible and picking primitives that can get away with pseudorandomness.</div><div><br></div><div>Furthermore, the library tries to make it hard to use cryptographic primitives incorrectly, by supplying higher-level APIs where the underlying primitives and their compositions have been pre-selected by cryptographers who knows what they are doing. While no guarantee, it does remove some typical mistakes.</div><div><br></div><div>Finally NaCl/libsodium is very fast, even for a large security margin. In other words, it is possible to encrypt high-bandwidth traffic for protection.</div><div><br></div><div>I've decided to implement yet another set of bindings for NaCl for Erlang as a set of C NIFs. These bindings differ from the earlier bindings in some areas:</div><div><br></div><div>* QuickCheck is used all over the place for positive/negative testing of the APIs correctness and lack of memory leaks.</div><div>* The bindings require Erlang 17.3.x and uses the experimental dirty scheduler API to avoid long-running NIFs. When called on small messages, the bindings will run the operation directly on the Erlang scheduler for speed however, and it will scale its reduction cost depending on the size of the message.</div><div>* Includes a complete timing module which can be used to measure if the reduction strategy used will fit on the target machine.</div><div><br></div><div>All in all, these bindings will be fast, and have low latency even on systems which will encrypt lots of data. They can be used to build cryptographic libraries for Erlang on top. For instance "gen_tcp_nacl".</div><div><br></div><div>Thanks:</div><div>  Tony Garnock-Jones whose bindings were an inspiration.</div><div>  Steve Vinoski, Rickard Green and Sverker Eriksson for Dirty Schedulers</div><div><br></div><div><a href="https://github.com/jlouis/enacl">https://github.com/jlouis/enacl</a><br></div><div><br></div><div>Also see,</div><div><br></div><div><a href="http://nacl.cr.yp.to/">http://nacl.cr.yp.to/</a><br></div><div><a href="https://github.com/jedisct1/libsodium">https://github.com/jedisct1/libsodium</a><br></div><div><br></div><div>Comments and patches welcome as always. Things are written with an MIT license for maximal use.</div><div><div><br></div>-- <br><div class="gmail_signature">J.</div>
</div></div>