From: Markus Triska Date: Wed, 13 May 2020 18:36:25 +0000 (+0200) Subject: ADDED: ripemd160 digest algorithm X-Git-Tag: v0.8.123~33^2~2^2 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=fd761735d40bc57a374eb1fb8a9396dd8f3abf3f;p=scryer-prolog.git ADDED: ripemd160 digest algorithm This is used for example for Bitcoin address generation. --- diff --git a/Cargo.toml b/Cargo.toml index 8e63ec9a..9f9dc993 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,3 +35,4 @@ rug = { version = "1.4.0", optional = true } rustyline = "6.0.0" unicode_reader = "1.0.0" ring = "0.16.13" +ripemd160 = "0.8.0" diff --git a/src/prolog/lib/crypto.pl b/src/prolog/lib/crypto.pl index 67b5ac80..44e8547e 100644 --- a/src/prolog/lib/crypto.pl +++ b/src/prolog/lib/crypto.pl @@ -138,7 +138,8 @@ crypto_random_byte(B) :- '$crypto_random_byte'(B). algorithm(A) - where A is one of sha256, sha384, sha512, sha512_256, or a variable. + where A is one of ripemd160, sha256, sha384, sha512, sha512_256, + or a variable. If A is a variable, then it is unified with the default algorithm, which is an algorithm that is considered cryptographically secure @@ -167,6 +168,7 @@ crypto_data_hash(Data, Hash, Options) :- '$crypto_data_hash'(Data, HashBytes, A), hex_bytes(Hash, HashBytes). +hash_algorithm(ripemd160). hash_algorithm(sha256). hash_algorithm(sha512). hash_algorithm(sha384). diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 47d7f911..b572af41 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -40,6 +40,7 @@ use crate::crossterm::terminal::{enable_raw_mode, disable_raw_mode}; use ring::rand::{SecureRandom, SystemRandom}; use ring::digest; +use ripemd160::{Ripemd160, Digest}; pub fn get_key() -> KeyEvent { let key; @@ -5255,18 +5256,23 @@ impl MachineState { } }; - let hash = digest::digest( - match algorithm_str { - "sha256" => { &digest::SHA256 } - "sha384" => { &digest::SHA384 } - "sha512" => { &digest::SHA512 } - "sha512_256" => { &digest::SHA512_256 } - _ => { unreachable!() } - }, - &bytes); - - let ints = hash.as_ref().iter().map(|b| HeapCellValue::Integer(Rc::new(Integer::from(*b)))); - let ints_list = Addr::HeapCell(self.heap.to_list(ints)); + let ints_list = + if algorithm_str == "ripemd160" { + let mut context = Ripemd160::new(); + context.input(&bytes); + Addr::HeapCell(self.heap.to_list(context.result().as_ref().iter().map(|b| HeapCellValue::Integer(Rc::new(Integer::from(*b)))))) + } else { + let ints = digest::digest( + match algorithm_str { + "sha256" => { &digest::SHA256 } + "sha384" => { &digest::SHA384 } + "sha512" => { &digest::SHA512 } + "sha512_256" => { &digest::SHA512_256 } + _ => { unreachable!() } + }, + &bytes); + Addr::HeapCell(self.heap.to_list(ints.as_ref().iter().map(|b| HeapCellValue::Integer(Rc::new(Integer::from(*b)))))) + }; self.unify(self[temp_v!(2)], ints_list); }