Skip to content
Quantum-resistant, purely Hash-based, Stateful, One-Time Digital Signatures for OCaml. 🛡 🐫 🔒 🔑 [Work In Progress]
OCaml Makefile
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs
lib
test
.gitignore
.ocamlformat
.ocamlinit
.ocp-indent
.travis.yml
LICENSE
Makefile
README.md
TODO.md
dune
dune-project
hieroglyphs.opam
package.json
yarn.lock

README.md

hieroglyphs

Quantum-resistant, purely Hash-based, Stateful, One-Time Digital Signatures for OCaml.


For further information, see:

This library uses the Blake2B hash algorithm, but further / additional hashes are planned as well. Currently, the following things are implemented now:

  • Importing/exporting encrypted private key (by now using AES ECB).
  • Public Key serialization+validation (to share and receive such key for verification).
  • Built-in one-time invariant protected by a blacklist of used private keys.
  • Tests covering the things here and there.
  • Benchmarks against currently famous Digital Signatures algorithms (RSA family, Elliptic Curves family, etc - by now only RSA see below).
  • API documentation for the project (I should prefer automatic generation of documentation tools and provide the API documentation online under GH pages).
  • Stress tests and prediction/timing simulated attacks, to prove the underlying library security and Private Key collision-free/resistance semantics.

The novel approach of this library is to sign every piece of hexadecimal character from a given hash, so our range to sign and verify bits/bytes is smaller (we only need 16 characters offset plus digest / fingerprint length of the message hash, in the case of Blake2B, 128 characters). By hashing beforehand our message, we can sign any size/length of input message, our signature, private key and public key stay on the same size.

Installation:

If this library is available on OPAM:

$ opam install hieroglyphs

Otherwise, through Dune build system:

$ dune install

Usage:

(Assuming you've linked this library as hieroglyphs...)

module Hg = Hieroglyphs

let (priv, pub) = Hg.pair ( ) in
let msg = "Hello, World!" in
match Hg.sign ~priv ~msg with
| None -> failwith "Private key was already signed!"
| Some signature -> assert (Hg.verify ~pub ~msg ~signature)

A blacklist of revoked Private Key unique & deterministic IDs is maintained at the directory $HOME/.hieroglyphs/state/blacklist. It's used to preserve the one-time signing invariant. You can inspect the additional bare Git repository provided by the Irmin library at $HOME/.hieroglyphs/state. If you don't like to pollute your home directory with configuration noise / garbage, you may override that with the environment variable $HIEROGLYPHS_ROOT. For instance, if you define:

HIEROGLYPHS_ROOT=/tmp/hg-data
export HIEROGLYPHS_ROOT

Then, your blacklist will be available under /tmp/hg-data/state/blacklist, and your Git repository under /tmp/hg-data/state.

For the complete API reference, check the docs here. Coverage reports are shown at this page.

Benchmarks:

Currently, we run benchmarks against the nocrypto RSA/PSS+SHA256 implementation, and the secp256k1 library (using a SHA256 hash as well on the message), besides our implementation in pure OCaml code using Blake2B (although future plans include C bindings). The benchmark test suite is available under the command $ make bench. It uses the quite good Jane Street's core_bench library. The cached benchmark report is generated by dune build system at the file test/bench/bench.expected whenever you type $ make bench.

Disclaimer:

This library was not yet fully tested against many sort of attacks, such as timing attacks, but nevertheless the real security lies behind the digestif and nocrypto libraries, which both provide strong hashes, strong RNGs and strong encryption. Use with care and take responsibility by your own acts.

License

FOSSA Status

You can’t perform that action at this time.