Initial checkin.
This commit is contained in:
commit
9a7f4c8d4e
13
Makefile
Normal file
13
Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
REBAR=rebar
|
||||
|
||||
.PHONY: compile
|
||||
compile: deps
|
||||
$(REBAR) compile
|
||||
|
||||
.PHONY: deps
|
||||
deps:
|
||||
$(REBAR) get-deps
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(REBAR) clean
|
10
README.md
Normal file
10
README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Erlang bindings for NaCl
|
||||
|
||||
This library provides bindings for the NaCl cryptographic library for Erlang. Several such libraries exist, but this one is a re-write with a number of different requirements, and foci:
|
||||
|
||||
* Erlang/OTP 17.3. This library *needs* the newest dirty scheduler implementation.
|
||||
* Uses the original NaCl sources over something like libsodium. This is a deliberate choice.
|
||||
* Tests created by aggressive use of Erlang QuickCheck.
|
||||
* provides gen_nacl, a gen_tcp wrapper for sending/receiving messages over a tcp socket.
|
||||
|
||||
This package draws heavy inspiration from "erlang-nacl" by Tony Garnock-Jones.
|
54
c_src/enacl_nif.c
Normal file
54
c_src/enacl_nif.c
Normal file
@ -0,0 +1,54 @@
|
||||
#include "erl_nif.h"
|
||||
|
||||
#include <sodium.h>
|
||||
|
||||
static
|
||||
ERL_NIF_TERM nacl_error_tuple(ErlNifEnv *env, char *error_atom) {
|
||||
return enif_make_tuple2(env, enif_make_atom(env, "error"), enif_make_atom(env, error_atom));
|
||||
}
|
||||
|
||||
static
|
||||
ERL_NIF_TERM enif_crypto_hash(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) {
|
||||
ErlNifBinary input;
|
||||
ErlNifBinary result;
|
||||
|
||||
if ((argc != 1) || (!enif_inspect_iolist_as_binary(env, argv[0], &input))) {
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
if (!enif_alloc_binary(crypto_hash_BYTES, &result)) {
|
||||
return nacl_error_tuple(env, "alloc_failed");
|
||||
}
|
||||
|
||||
crypto_hash(result.data, input.data, input.size);
|
||||
|
||||
return enif_make_binary(env, &result);
|
||||
}
|
||||
|
||||
static
|
||||
ERL_NIF_TERM enif_crypto_box_keypair(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) {
|
||||
ErlNifBinary pk, sk;
|
||||
|
||||
if (argc != 0) {
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
if (!enif_alloc_binary(crypto_box_PUBLICKEYBYTES, &pk)) {
|
||||
return nacl_error_tuple(env, "alloc_failed");
|
||||
}
|
||||
|
||||
if (!enif_alloc_binary(crypto_box_SECRETKEYBYTES, &sk)) {
|
||||
return nacl_error_tuple(env, "alloc_failed");
|
||||
}
|
||||
|
||||
crypto_box_keypair(pk.data, sk.data);
|
||||
|
||||
return enif_make_tuple3(env, enif_make_atom(env, "ok"), enif_make_binary(env, &pk), enif_make_binary(env, &sk));
|
||||
}
|
||||
|
||||
static ErlNifFunc nif_funcs[] = {
|
||||
{"crypto_box_keypair", 0, enif_crypto_box_keypair},
|
||||
{"crypto_hash", 1, enif_crypto_hash, ERL_NIF_DIRTY_JOB_CPU_BOUND}
|
||||
};
|
||||
|
||||
ERL_NIF_INIT(enacl_nif, nif_funcs, NULL, NULL, NULL, NULL);
|
5
eqc_test/Makefile
Normal file
5
eqc_test/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
console:
|
||||
erl -pa ../ebin ../deps/*/ebin
|
||||
|
||||
clean:
|
||||
rm *.beam
|
33
eqc_test/enacl_eqc.erl
Normal file
33
eqc_test/enacl_eqc.erl
Normal file
@ -0,0 +1,33 @@
|
||||
-module(enacl_eqc).
|
||||
-include_lib("eqc/include/eqc.hrl").
|
||||
-compile(export_all).
|
||||
|
||||
%% CRYPTO BOX
|
||||
%% ---------------------------
|
||||
|
||||
prop_box_keypair() ->
|
||||
?FORALL(_X, return(dummy),
|
||||
ok_box(enacl:box_keypair())).
|
||||
|
||||
ok_box({ok, _PK, _SK}) -> true;
|
||||
ok_box(_) -> false.
|
||||
|
||||
|
||||
%% HASHING
|
||||
%% ---------------------------
|
||||
diff_pair(Sz) ->
|
||||
?SUCHTHAT({X, Y}, {binary(Sz), binary(Sz)},
|
||||
X /= Y).
|
||||
|
||||
prop_crypto_hash_eq() ->
|
||||
?FORALL(Sz, oneof([1, 128, 1024, 1024*4]),
|
||||
?FORALL(X, binary(Sz),
|
||||
equals(enacl:hash(X), enacl:hash(X))
|
||||
)).
|
||||
|
||||
prop_crypto_hash_neq() ->
|
||||
?FORALL(Sz, oneof([1, 128, 1024, 1024*4]),
|
||||
?FORALL({X, Y}, diff_pair(Sz),
|
||||
enacl:hash(X) /= enacl:hash(Y)
|
||||
)).
|
||||
|
8
rebar.config
Normal file
8
rebar.config
Normal file
@ -0,0 +1,8 @@
|
||||
{erl_opts, [debug_info]}.
|
||||
|
||||
{port_env, [
|
||||
{"CFLAGS", "$CFLAGS $LIBSODIUM_CFLAGS"},
|
||||
{"LDFLAGS", "$LDFLAGS $LIBSODIUM_LDFLAGS -lsodium"}
|
||||
]}.
|
||||
|
||||
{port_specs, [{"priv/enacl_nif.so", ["c_src/*.c"]}]}.
|
2
src/Makefile
Normal file
2
src/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
all:
|
||||
$(MAKE) -C .. compile
|
9
src/enacl.app.src
Normal file
9
src/enacl.app.src
Normal file
@ -0,0 +1,9 @@
|
||||
{application, enacl,
|
||||
[
|
||||
{description, "Erlang NaCl bindings"},
|
||||
{vsn, "0.0.1"},
|
||||
{registered, []},
|
||||
{applications, [kernel, stdlib]},
|
||||
{mod, {enacl_app, []}},
|
||||
{env, []}
|
||||
]}.
|
13
src/enacl.erl
Normal file
13
src/enacl.erl
Normal file
@ -0,0 +1,13 @@
|
||||
-module(enacl).
|
||||
|
||||
-export([
|
||||
hash/1,
|
||||
box_keypair/0
|
||||
]).
|
||||
|
||||
hash(Bin) ->
|
||||
enacl_nif:crypto_hash(Bin).
|
||||
|
||||
box_keypair() ->
|
||||
enacl_nif:crypto_box_keypair().
|
||||
|
10
src/enacl_app.erl
Normal file
10
src/enacl_app.erl
Normal file
@ -0,0 +1,10 @@
|
||||
-module(enacl_app).
|
||||
-behaviour(application).
|
||||
|
||||
-export([start/2, stop/1]).
|
||||
|
||||
start(_StartType, _StartArgs) ->
|
||||
enacl_sup:start_link().
|
||||
|
||||
stop(_State) ->
|
||||
ok.
|
21
src/enacl_nif.erl
Normal file
21
src/enacl_nif.erl
Normal file
@ -0,0 +1,21 @@
|
||||
-module(enacl_nif).
|
||||
|
||||
-export([
|
||||
crypto_hash/1,
|
||||
crypto_box_keypair/0
|
||||
]).
|
||||
-on_load(init/0).
|
||||
|
||||
init() ->
|
||||
SoName = filename:join(
|
||||
case code:priv_dir(enacl) of
|
||||
{error, bad_name} ->
|
||||
filename:join(filename:dirname(filename:dirname(code:which(?MODULE))), "priv");
|
||||
Dir ->
|
||||
Dir
|
||||
end, atom_to_list(?MODULE)),
|
||||
erlang:load_nif(SoName, 0).
|
||||
|
||||
crypto_hash(Input) when is_binary(Input) -> error({nif_not_loaded, ?MODULE}).
|
||||
crypto_box_keypair() -> error({nif_not_loaded, ?MODULE}).
|
||||
|
Loading…
x
Reference in New Issue
Block a user