]> Repositorios git - scryer-prolog.git/commitdiff
ADDED: Support for SHA-3 algorithms in crypto_data_hash/3
authorMarkus Triska <[email protected]>
Tue, 19 May 2020 08:50:33 +0000 (10:50 +0200)
committerMarkus Triska <[email protected]>
Tue, 19 May 2020 10:10:46 +0000 (12:10 +0200)
Cargo.toml
src/prolog/lib/crypto.pl
src/prolog/machine/system_calls.rs

index 3f48283ce0813ab2e18a1ce3538b8b8abcd6abb2..6e5c657eb8e725c5f314d82312579e47f3752e40 100644 (file)
@@ -36,3 +36,4 @@ rustyline = "6.0.0"
 unicode_reader = "1.0.0"
 ring = "0.16.13"
 ripemd160 = "0.8.0"
+sha3 = "0.8.2"
index 909127d4d6849c758a1549f7ef766e88fc4b917a..9881afba42b24ed2d7fe9785a46e2da2be19388c 100644 (file)
@@ -159,10 +159,10 @@ crypto_random_byte(B) :- '$crypto_random_byte'(B).
 
      - algorithm(+A)
        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 at the time of this
-       writing.
+       sha512_256, sha3_224, sha3_256, sha3_384, sha3_512, 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 at the time of this writing.
      - encoding(+Encoding)
        The default encoding is utf8. The alternative is octet,
        to treat the input as a list of raw bytes.
@@ -215,6 +215,10 @@ hash_algorithm(sha256).
 hash_algorithm(sha512).
 hash_algorithm(sha384).
 hash_algorithm(sha512_256).
+hash_algorithm(sha3_224).
+hash_algorithm(sha3_256).
+hash_algorithm(sha3_384).
+hash_algorithm(sha3_512).
 
 
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -230,10 +234,9 @@ hash_algorithm(sha512_256).
    Admissible options are:
 
      - algorithm(+Algorithm)
-       A hashing algorithm as specified to crypto_data_hash/3. The
-       default is a cryptographically secure algorithm. If you
-       specify a variable, then it is unified with the algorithm
-       that was used, which is a cryptographically secure algorithm.
+       One of sha256, sha384 or sha512. If you specify a variable,
+       then it is unified with the algorithm that was used, which is a
+       cryptographically secure algorithm by default.
      - info(+Info)
        Optional context and application specific information,
        specified as a list of bytes or characters. The default is [].
index 6160e7dd7485e1c1ab28fad19a20401780fb602e..9643aac5e9017a93c922dcd0d167cabfed9895e5 100644 (file)
@@ -42,6 +42,7 @@ use crate::crossterm::terminal::{enable_raw_mode, disable_raw_mode};
 use ring::rand::{SecureRandom, SystemRandom};
 use ring::{digest,hkdf,pbkdf2,aead,error};
 use ripemd160::{Ripemd160, Digest};
+use sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512};
 
 pub fn get_key() -> KeyEvent {
     let key;
@@ -5219,7 +5220,23 @@ impl MachineState {
                 };
 
                 let ints_list =
-                        if algorithm_str == "ripemd160" {
+                        if algorithm_str == "sha3_224" {
+                             let mut context = Sha3_224::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 if algorithm_str == "sha3_256" {
+                             let mut context = Sha3_256::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 if algorithm_str == "sha3_384" {
+                             let mut context = Sha3_384::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 if algorithm_str == "sha3_512" {
+                             let mut context = Sha3_512::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 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))))))
@@ -5278,7 +5295,7 @@ impl MachineState {
                                   "sha256" =>     { hkdf::HKDF_SHA256 }
                                   "sha384" =>     { hkdf::HKDF_SHA384 }
                                   "sha512" =>     { hkdf::HKDF_SHA512 }
-                                  _ =>            { unreachable!() }
+                                  _ =>            { self.fail = true; return Ok(()); }
                                };
                              let salt = hkdf::Salt::new(digest_alg, &salt);
                              let mut bytes : Vec<u8> = Vec::new();