From 781b446db8ce3f5810c57dcb668f6233333d999c Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 16 Jun 2021 14:05:07 +0300 Subject: [PATCH 1/4] update rustler --- .tool-versions | 2 + CHANGELOG.md | 4 ++ README.md | 15 ++--- lib/ex_keccak.ex | 11 +--- lib/ex_keccak/impl.ex | 6 -- mix.exs | 6 +- mix.lock | 2 +- native/exkeccak/Cargo.lock | 124 ++++++------------------------------- native/exkeccak/Cargo.toml | 2 +- native/exkeccak/src/lib.rs | 34 +++------- test/ex_keccak_test.exs | 14 +++-- 11 files changed, 53 insertions(+), 167 deletions(-) create mode 100644 .tool-versions delete mode 100644 lib/ex_keccak/impl.ex diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..a08d68f --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +elixir 1.12.1-otp-24 +erlang 24.0.1 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 063a897..f3fe1d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v0.2.0 + + * Update ruslter to support OTP 24 + ## v0.1.3 * Move NIF interface to module `ExKeccak.Impl`, making `ExKeccak` a wrapper diff --git a/README.md b/README.md index 69101a7..86e4041 100644 --- a/README.md +++ b/README.md @@ -11,27 +11,20 @@ The package can be installed by adding `ex_keccak` to your list of dependencies ```elixir def deps do [ - {:ex_keccak, "~> 0.1.3"} + {:ex_keccak, "~> 0.2.0"} ] end ``` ## Usage -To calculate KECCAK-256 hash, use `ExKeccak.hash_256/1` function. It returns `{:ok, result}` on success: +To calculate KECCAK-256 hash, use `ExKeccak.hash_256/1` function. It returns `result` on success: ```elixir -{ - :ok, - <<28, 138, 255, 149, 6, 133, 194, 237, 75, 195, 23, 79, 52, 114, 40, 123, 86, 217, 81, 123, 156, 148, 129, 39, 49, 154, 9, 167, 163, 109, 234, 200>> -} = ExKeccak.hash_256("hello") + <<28, 138, 255, 149, 6, 133, 194, 237, 75, 195, 23, 79, 52, 114, 40, 123, 86, 217, 81, 123, 156, 148, 129, 39, 49, 154, 9, 167, 163, 109, 234, 200>> = ExKeccak.hash_256("hello") ``` -And it returns `{:error, :invalid_type}` if the provided data is not binary: - -```elixir -{:error, :invalid_type} = ExKeccak.hash_256(11) -``` +And it returns `ArgumentError` is provided data is not binary ## Contributing diff --git a/lib/ex_keccak.ex b/lib/ex_keccak.ex index 854f4ff..a2789ce 100644 --- a/lib/ex_keccak.ex +++ b/lib/ex_keccak.ex @@ -1,12 +1,5 @@ defmodule ExKeccak do - defdelegate hash_256(data), to: ExKeccak.Impl + use Rustler, otp_app: :ex_keccak, crate: :exkeccak - def hash_256!(data) do - case hash_256(data) do - {:ok, hash} -> - hash - {:error, :invalid_type} -> - raise ArgumentError, "#{inspect(data)} is not hashable" - end - end + def hash_256(_data), do: :erlang.nif_error(:nif_not_loaded) end diff --git a/lib/ex_keccak/impl.ex b/lib/ex_keccak/impl.ex deleted file mode 100644 index ffa6884..0000000 --- a/lib/ex_keccak/impl.ex +++ /dev/null @@ -1,6 +0,0 @@ -defmodule ExKeccak.Impl do - @moduledoc false - - use Rustler, otp_app: :ex_keccak, crate: :exkeccak - def hash_256(_data), do: :erlang.nif_error(:nif_not_loaded) -end diff --git a/mix.exs b/mix.exs index f26581a..bc95552 100644 --- a/mix.exs +++ b/mix.exs @@ -4,10 +4,10 @@ defmodule ExKeccak.MixProject do def project do [ app: :ex_keccak, - version: "0.1.3", + version: "0.2.0", elixir: "~> 1.10", description: description(), - compilers: [:rustler] ++ Mix.compilers(), + compilers: Mix.compilers(), build_embedded: Mix.env() == :prod, start_permanent: Mix.env() == :prod, rustler_crates: rustler_crates(), @@ -64,7 +64,7 @@ defmodule ExKeccak.MixProject do [ {:ex_doc, "~> 0.21", only: :dev, runtime: false}, {:benchee, "~> 1.0.1", only: :test}, - {:rustler, "~> 0.21.1"} + {:rustler, "~> 0.22.0-rc.1"} ] end end diff --git a/mix.lock b/mix.lock index a6cdf39..2c22de1 100644 --- a/mix.lock +++ b/mix.lock @@ -6,6 +6,6 @@ "makeup": {:hex, :makeup, "1.0.3", "e339e2f766d12e7260e6672dd4047405963c5ec99661abdc432e6ec67d29ef95", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "2e9b4996d11832947731f7608fed7ad2f9443011b3b479ae288011265cdd3dad"}, "makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"}, "nimble_parsec": {:hex, :nimble_parsec, "0.6.0", "32111b3bf39137144abd7ba1cce0914533b2d16ef35e8abc5ec8be6122944263", [:mix], [], "hexpm", "27eac315a94909d4dc68bc07a4a83e06c8379237c5ea528a9acff4ca1c873c52"}, - "rustler": {:hex, :rustler, "0.21.1", "5299980be32da997c54382e945bacaa015ed97a60745e1e639beaf6a7b278c65", [:mix], [{:toml, "~> 0.5.2", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "6ee1651e10645b2b2f3bb70502bf180341aa058709177e9bc28c105934094bc6"}, + "rustler": {:hex, :rustler, "0.22.0-rc.1", "46668ba0c5f97e8aa978ee965c473f7d4ab5560182ebf2c3bb1cf18956f92afb", [:mix], [{:toml, "~> 0.5.2", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "c0eb17d6c52885153218e89b2877122cdb094aeefd191647f78094022f3b9101"}, "toml": {:hex, :toml, "0.5.2", "e471388a8726d1ce51a6b32f864b8228a1eb8edc907a0edf2bb50eab9321b526", [:mix], [], "hexpm", "f1e3dabef71fb510d015fad18c0e05e7c57281001141504c6b69d94e99750a07"}, } diff --git a/native/exkeccak/Cargo.lock b/native/exkeccak/Cargo.lock index 8b87e62..bb57bcd 100644 --- a/native/exkeccak/Cargo.lock +++ b/native/exkeccak/Cargo.lock @@ -1,39 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -[[package]] -name = "addr2line" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" - -[[package]] -name = "backtrace" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +version = 3 [[package]] name = "crunchy" @@ -50,26 +17,11 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", -] - -[[package]] -name = "gimli" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" - [[package]] name = "heck" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] @@ -80,68 +32,40 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "libc" -version = "0.2.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f02823cf78b754822df5f7f268fb59822e7296276d3e069d8e8cb26a14bd10" - -[[package]] -name = "miniz_oxide" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0f75932c1f6cfae3c04000e40114adf955636e19040f9c0a2c380702aa1c7f" -dependencies = [ - "adler", -] - -[[package]] -name = "object" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" - [[package]] name = "proc-macro2" -version = "0.4.30" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "0.6.13" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] -[[package]] -name = "rustc-demangle" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" - [[package]] name = "rustler" -version = "0.21.1" +version = "0.22.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533dc3379a0f166749ce262a941e9b52ce19c3208729fc6b6cce76aea76d939b" +checksum = "2f90ea8dd9981f97a097792052a75572981ed195aed5110365e12be8984d5a38" dependencies = [ "lazy_static", "rustler_codegen", "rustler_sys", - "which", ] [[package]] name = "rustler_codegen" -version = "0.21.1" +version = "0.22.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21563a1c4b02773f5c6dce723630c9998694258ff4d67bd6025ba057a29b51c" +checksum = "e62e80799e0de5d9a038424c0883431981c22d70d98bd72ea52443eb381a5aa3" dependencies = [ "heck", "proc-macro2", @@ -151,18 +75,18 @@ dependencies = [ [[package]] name = "rustler_sys" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb96034ff33723615fd19223d58c987c1f6476342e83557a6e467ef95f83bda" +checksum = "1cb382fde4f421c51555919e9920b058c0286f6bf59e53d02eb4d281eae6758b" dependencies = [ "unreachable", ] [[package]] name = "syn" -version = "0.15.44" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ "proc-macro2", "quote", @@ -180,15 +104,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" [[package]] name = "unicode-xid" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "unreachable" @@ -204,13 +128,3 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "which" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" -dependencies = [ - "failure", - "libc", -] diff --git a/native/exkeccak/Cargo.toml b/native/exkeccak/Cargo.toml index 3181f70..3fd63ec 100644 --- a/native/exkeccak/Cargo.toml +++ b/native/exkeccak/Cargo.toml @@ -10,6 +10,6 @@ path = "src/lib.rs" crate-type = ["dylib"] [dependencies] -rustler = "0.21.1" +rustler = "0.22.0-rc.1" lazy_static = "1.0" tiny-keccak = { version = "2.0", features = ["keccak"] } diff --git a/native/exkeccak/src/lib.rs b/native/exkeccak/src/lib.rs index a2be368..4598b36 100644 --- a/native/exkeccak/src/lib.rs +++ b/native/exkeccak/src/lib.rs @@ -1,34 +1,14 @@ -use rustler::types::binary::{Binary, OwnedBinary}; -use rustler::types::Encoder; -use rustler::{Env, Term}; use tiny_keccak::{Hasher, Keccak}; +use rustler::types::binary::Binary; +use rustler::types::binary::OwnedBinary; -mod atoms { - rustler::rustler_atoms! { - atom ok; - atom error; - atom invalid_type; - } -} - -rustler::rustler_export_nifs! { - "Elixir.ExKeccak.Impl", - [ - ("hash_256", 1, hash_256, rustler::SchedulerFlags::DirtyCpu) - ], - None -} - -fn hash_256<'a>(env: Env<'a>, args: &[Term<'a>]) -> Term<'a> { - let data: Binary = match args[0].decode() { - Ok(binary) => binary, - Err(_error) => return (atoms::error(), atoms::invalid_type()).encode(env), - }; - let data_slice = data.as_slice(); +rustler::init!("Elixir.ExKeccak", [hash_256]); +#[rustler::nif] +fn hash_256<'a>(data: Binary) -> OwnedBinary { let mut keccak = Keccak::v256(); - keccak.update(data_slice); + keccak.update(data.as_slice()); let mut result: [u8; 32] = [0; 32]; keccak.finalize(&mut result); @@ -36,5 +16,5 @@ fn hash_256<'a>(env: Env<'a>, args: &[Term<'a>]) -> Term<'a> { let mut erl_bin: OwnedBinary = OwnedBinary::new(32).unwrap(); erl_bin.as_mut_slice().copy_from_slice(&result); - (atoms::ok(), erl_bin.release(env)).encode(env) + erl_bin } diff --git a/test/ex_keccak_test.exs b/test/ex_keccak_test.exs index 320eb01..50f068a 100644 --- a/test/ex_keccak_test.exs +++ b/test/ex_keccak_test.exs @@ -9,7 +9,7 @@ defmodule ExKeccakTest do "5d1Ch4jboo9DcCWGj55ZT/tsW4nnG5+DlCFGddOfjTZmfQdzc4yBnodqszjYIaI+8Io41a789cV5rUwzvqxLzw==" ) - {:ok, hashed_data} = ExKeccak.hash_256(data) + hashed_data = ExKeccak.hash_256(data) assert <<_::binary-12, address::binary-20>> = hashed_data @@ -17,15 +17,21 @@ defmodule ExKeccakTest do end test "fails to decode number" do - assert {:error, :invalid_type} = ExKeccak.hash_256(11) + assert_raise ArgumentError, fn -> + ExKeccak.hash_256(11) + end end test "fails to decode nil" do - assert {:error, :invalid_type} = ExKeccak.hash_256(nil) + assert_raise ArgumentError, fn -> + ExKeccak.hash_256(nil) + end end test "fails to decode atom" do - assert {:error, :invalid_type} = ExKeccak.hash_256(:atom) + assert_raise ArgumentError, fn -> + ExKeccak.hash_256(:atom) + end end @tag :perf From e4d95f2e239c57e1bd3c8d041a7de426c80d9997 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 16 Jun 2021 14:42:03 +0300 Subject: [PATCH 2/4] Update CHANGELOG.md Co-authored-by: Raz --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3fe1d9..ed8a88f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## v0.2.0 - * Update ruslter to support OTP 24 + * Update rustler to support OTP 24 ## v0.1.3 From b8d66c9a52f4346b99112e0f99cdc52260ad573c Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Wed, 16 Jun 2021 14:49:33 +0300 Subject: [PATCH 3/4] change version --- CHANGELOG.md | 2 +- README.md | 2 +- mix.exs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed8a88f..760cd47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## v0.2.0 +## v1.0.0 * Update rustler to support OTP 24 diff --git a/README.md b/README.md index 86e4041..29178aa 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The package can be installed by adding `ex_keccak` to your list of dependencies ```elixir def deps do [ - {:ex_keccak, "~> 0.2.0"} + {:ex_keccak, "~> 1.0.0"} ] end ``` diff --git a/mix.exs b/mix.exs index bc95552..0e736e1 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule ExKeccak.MixProject do def project do [ app: :ex_keccak, - version: "0.2.0", + version: "1.0.0", elixir: "~> 1.10", description: description(), compilers: Mix.compilers(), From a2dacc8d3c05f5cb90f10e0c4b843687c069eec8 Mon Sep 17 00:00:00 2001 From: Ayrat Badykov Date: Thu, 17 Jun 2021 15:08:05 +0300 Subject: [PATCH 4/4] change version to 0.2.0 --- CHANGELOG.md | 3 ++- README.md | 2 +- mix.exs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 760cd47..579deb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # Changelog -## v1.0.0 +## v0.2.0 * Update rustler to support OTP 24 + * Leave only throwing function ## v0.1.3 diff --git a/README.md b/README.md index 29178aa..86e4041 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The package can be installed by adding `ex_keccak` to your list of dependencies ```elixir def deps do [ - {:ex_keccak, "~> 1.0.0"} + {:ex_keccak, "~> 0.2.0"} ] end ``` diff --git a/mix.exs b/mix.exs index 0e736e1..bc95552 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule ExKeccak.MixProject do def project do [ app: :ex_keccak, - version: "1.0.0", + version: "0.2.0", elixir: "~> 1.10", description: description(), compilers: Mix.compilers(),