From ee5aec87adab4b5339c9fd15e927c21262d9692c Mon Sep 17 00:00:00 2001 From: Eitan Chatav Date: Wed, 9 Nov 2016 18:29:57 -0800 Subject: [PATCH] check proof of work --- src/utils/crypto_box.ml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/utils/crypto_box.ml b/src/utils/crypto_box.ml index fb06f3fed..97db6c028 100644 --- a/src/utils/crypto_box.ml +++ b/src/utils/crypto_box.ml @@ -25,7 +25,23 @@ let box_open sk pk msg nonce = try Some (Sodium.Box.Bigbytes.box_open sk pk msg nonce) with | Sodium.Verification_failure -> None -let check_proof_of_work pk nonce difficulty = assert false +let check_proof_of_work pk nonce difficulty = + let hash_bytes l = + let hash = Cryptokit.Hash.sha256 () in + List.iter (fun b -> hash#add_string (MBytes.to_string b)) l; + let r = hash#result in hash#wipe; r in + let hash = + hash_bytes + [ Sodium.Box.Bigbytes.of_public_key pk ; + Sodium.Box.Bigbytes.of_nonce nonce ] in + let bytes = MBytes.of_string hash in + let len = MBytes.length bytes * 8 in + try + for i = len - 1 downto (len - difficulty) do + if MBytes.get_bool bytes i then raise Exit + done; + true + with Exit -> false let generate_proof_of_work pk difficulty = let rec loop nonce = if check_proof_of_work pk nonce difficulty then nonce