Skip to content

Quantum-resistant, purely Hash-based, Stateful, One-Time Digital Signatures for OCaml. 🛡️ 🐫 🔒 🔑 [Work In Progress]

License

Notifications You must be signed in to change notification settings

marcoonroad/hieroglyphs

Repository files navigation

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

About

Quantum-resistant, purely Hash-based, Stateful, One-Time Digital Signatures for OCaml. 🛡️ 🐫 🔒 🔑 [Work In Progress]

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published