Code Monkey home page Code Monkey logo

monocypher's Introduction

TrustInSoft CI

Github Actions CI

Monocypher (Developer Edition)

(This is the bleeding edge, not yet released version. If you just want to use Monocypher, grab the latest version, or download the source and header files directly. If you want to contribute, see the notes at the end.)


Monocypher is an easy to use, easy to deploy, auditable crypto library written in portable C. It approaches the size of TweetNaCl and the speed of libsodium.

Official site.
Official releases.

Features

Manual

The manual can be found at https://monocypher.org/manual/, and in the doc/ folder.

Installation

Option 1: grab the sources

The easiest way to use Monocypher is to include src/monocypher.h and src/monocypher.c directly into your project. They compile as C (since C99) and C++ (since C++98).

If you need the optional SHA-512 or Ed25519, grab src/optional/monocypher-ed25519.h and src/optional/monocypher-ed25519.c as well.

Option 2: grab the library

Run make, then grab the src/monocypher.h header and either the lib/libmonocypher.a or lib/libmonocypher.so library. The default compiler is gcc -std=c99, and the default flags are -pedantic -Wall -Wextra -O3 -march=native. If they don't work on your platform, you can change them like this:

$ make CC="clang -std=c11" CFLAGS="-O2"

Option 3: install it on your system

Run make, then make install as root. This will install Monocypher in /usr/local by default. This can be changed with PREFIX and DESTDIR:

$ make install PREFIX="/opt"

Once installed, you may use pkg-config to compile and link your program. For instance:

$ gcc program.c $(pkg-config monocypher --cflags) -c
$ gcc program.o $(pkg-config monocypher --libs)   -o program

If for any reason you wish to avoid installing the man pages or the pkg-config file, you can use the following installation sub targets instead: install-lib, install-doc, and install-pc.

Test suite

$ make test

It should display a nice printout of all the tests, ending with "All tests OK!". If you see "failure" or "Error" anywhere, something has gone wrong.

Do not use Monocypher without running those tests at least once.

The same test suite can be run under Clang sanitisers and Valgrind, and be checked for code coverage:

$ tests/test.sh
$ tests/coverage.sh

Serious auditing

The code may be analysed more formally with Frama-c and the TIS interpreter. To analyse the code with Frama-c, run:

$ tests/formal-analysis.sh
$ tests/frama-c.sh

This will have Frama-c parse, and analyse the code, then launch a GUI. You must have Frama-c installed. See frama-c.sh for the recommended settings. To run the code under the TIS interpreter, run

$ tests/formal-analysis.sh
$ tis-interpreter.sh --cc -Dvolatile= tests/formal-analysis/*.c

Notes:

  • tis-interpreter.sh is part of TIS. If it is not in your path, adjust the command accordingly.

  • The TIS interpreter sometimes fails to evaluate correct programs when they use the volatile keyword (which is only used as an attempt to prevent dead store elimination for memory wipes). The -cc -Dvolatile= option works around that bug by ignoring volatile altogether.

Customisation

Monocypher has optional compatibility with Ed25519. To have that, add monocypher-ed25519.h and monocypher-ed25519.c provided in src/optional to your project. If you compile or install Monocypher with the makefile, they will be automatically included.

Monocypher also has the BLAKE2_NO_UNROLLING preprocessor flag, which is activated by compiling monocypher.c with the -DBLAKE2_NO_UNROLLING option.

The -DBLAKE2_NO_UNROLLING option is a performance tweak. By default, Monocypher unrolls the BLAKE2b inner loop, because doing so is over 25% faster on modern processors. Some embedded processors however, run the unrolled loop slower (possibly because of the cost of fetching 5KB of additional code). If you're using an embedded platform, try this option. The binary will be about 5KB smaller, and in some cases faster.

The MONOCYPHER_CPP_NAMESPACE preprocessor definition allows C++ users who compile Monocypher as C++ to wrap it in a namespace. When it is not defined (the default), we assume Monocypher is compiled as C, and an extern "C" declaration is added when we detect that the header is included in C++ code.

The change-prefix.sh script can rename all functions by replacing crypto_ by a chosen prefix, so you can avoid name clashes. For instance, the following command changes all instances of crypto_ by foobar_ (note the absence of the underscore):

./change-prefix.sh foobar

Contributor notes

If you are reading this, you cloned the GitHub repository. You miss a couple files that ship with the tarball releases:

  • The tests/vectors.h header. Generating it requires libsodium. Go to tests/gen/, then run make.
  • The html version of the manual, generated by the doc/doc_gen.sh script. You will need mandoc and Python 3.

To generate a tarball, simply type make dist. It will make a tarball with a name that matches the current version (using git describe), in the current directory.

monocypher's People

Contributors

loupvaillant avatar fscoto avatar mikejsavage avatar cfogelklou avatar setharchambault avatar michaelforney avatar richwalm avatar samuel-lucas6 avatar rain-1 avatar njlr avatar luiz-sdf avatar vbmithr avatar stevefan1999-personal avatar occivink avatar sikmir avatar noocsharp avatar mikea1 avatar snej avatar sgtcodfish avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.