% SPDX-FileCopyrightText: 2020 pukkamustard % % SPDX-License-Identifier: LGPL-3.0-or-later -module(monocypher). -export([crypto_lock/4, crypto_unlock/4]). -export([crypto_blake2b/1, crypto_blake2b_general/3]). -export([crypto_ietf_chacha20/3, crypto_ietf_chacha20_ctr/4]). -on_load(init/0). -define(APPNAME, monocypher). -define(LIBNAME, monocypher). %% Authenticated Encryption -type crypto_lock_mac() :: <<_:128>>. -type crypto_lock_key() :: <<_:256>>. -type crypto_lock_nonce() :: <<_:192>>. -spec crypto_lock(crypto_lock_mac(), crypto_lock_key(), crypto_lock_nonce(), binary()) -> binary(). crypto_lock(_,_,_,_) -> not_loaded(?LINE). -spec crypto_unlock(crypto_lock_key(), crypto_lock_nonce(), crypto_lock_mac(), binary()) -> {'ok', binary()} | {'error', integer()}. crypto_unlock(_,_,_,_) -> not_loaded(?LINE). %% Hashing -spec crypto_blake2b(binary()) -> binary(). crypto_blake2b(_) -> not_loaded(?LINE). -type crypto_blake2b_hash_size() :: 1..64. -type crypto_blake2b_key() :: <<_:_*8>>. -spec crypto_blake2b_general(crypto_blake2b_hash_size(), crypto_blake2b_key(), binary()) -> binary(). crypto_blake2b_general(_,_,_) -> not_loaded(?LINE). %% IETF ChaCha20 -type crypto_ietf_chacha20_key() :: <<_:256>>. -type crypto_ietf_chacha20_nonce() :: <<_:96>>. -spec crypto_ietf_chacha20(binary(), crypto_ietf_chacha20_key(), crypto_ietf_chacha20_nonce()) -> binary(). crypto_ietf_chacha20(_,_,_) -> not_loaded(?LINE). -spec crypto_ietf_chacha20_ctr(binary(), crypto_ietf_chacha20_key(), crypto_ietf_chacha20_nonce(), pos_integer()) -> binary(). crypto_ietf_chacha20_ctr(_,_,_,_) -> not_loaded(?LINE). init() -> SoName = case code:priv_dir(?APPNAME) of {error, bad_name} -> case filelib:is_dir(filename:join(["..", priv])) of true -> filename:join(["..", priv, ?LIBNAME]); _ -> filename:join([priv, ?LIBNAME]) end; Dir -> filename:join(Dir, ?LIBNAME) end, erlang:load_nif(SoName, 0). not_loaded(Line) -> erlang:nif_error({not_loaded, [{module, ?MODULE}, {line, Line}]}).