feat(tvix/eval): implement builtins.hashString
				
					
				
			Implements md5, sha1, sha256 and sha512 using the related crates from the RustCrypto hashes project (https://github.com/RustCrypto/hashes) Change-Id: I00730dea44ec9ef85309edc27addab0ae88814b8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11005 Tested-by: BuildkiteCI Reviewed-by: aspen <root@gws.fyi>
This commit is contained in:
		
							parent
							
								
									ffb134398d
								
							
						
					
					
						commit
						5c3065b43a
					
				
					 14 changed files with 263 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -5,9 +5,14 @@
 | 
			
		|||
 | 
			
		||||
use bstr::{ByteSlice, ByteVec};
 | 
			
		||||
use builtin_macros::builtins;
 | 
			
		||||
use data_encoding::HEXLOWER;
 | 
			
		||||
use genawaiter::rc::Gen;
 | 
			
		||||
use imbl::OrdMap;
 | 
			
		||||
use md5::Md5;
 | 
			
		||||
use regex::Regex;
 | 
			
		||||
use sha1::Sha1;
 | 
			
		||||
use sha2::digest::Output;
 | 
			
		||||
use sha2::{Digest, Sha256, Sha512};
 | 
			
		||||
use std::cmp::{self, Ordering};
 | 
			
		||||
use std::collections::VecDeque;
 | 
			
		||||
use std::collections::{BTreeMap, HashSet};
 | 
			
		||||
| 
						 | 
				
			
			@ -686,15 +691,24 @@ mod pure_builtins {
 | 
			
		|||
 | 
			
		||||
    #[builtin("hashString")]
 | 
			
		||||
    #[allow(non_snake_case)]
 | 
			
		||||
    async fn builtin_hashString(
 | 
			
		||||
        co: GenCo,
 | 
			
		||||
        _algo: Value,
 | 
			
		||||
        _string: Value,
 | 
			
		||||
    ) -> Result<Value, ErrorKind> {
 | 
			
		||||
        // FIXME: propagate contexts here.
 | 
			
		||||
        Ok(Value::from(CatchableErrorKind::UnimplementedFeature(
 | 
			
		||||
            "hashString".into(),
 | 
			
		||||
        )))
 | 
			
		||||
    async fn builtin_hashString(co: GenCo, algo: Value, s: Value) -> Result<Value, ErrorKind> {
 | 
			
		||||
        fn hash<D: Digest>(b: &[u8]) -> Output<D> {
 | 
			
		||||
            let mut hasher = D::new();
 | 
			
		||||
            hasher.update(b);
 | 
			
		||||
            hasher.finalize()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let s = s.to_str()?;
 | 
			
		||||
 | 
			
		||||
        let encoded_hash = match algo.to_str()?.as_bytes() {
 | 
			
		||||
            b"md5" => HEXLOWER.encode(hash::<Md5>(&s).as_bstr()),
 | 
			
		||||
            b"sha1" => HEXLOWER.encode(hash::<Sha1>(&s).as_bstr()),
 | 
			
		||||
            b"sha256" => HEXLOWER.encode(hash::<Sha256>(&s).as_bstr()),
 | 
			
		||||
            b"sha512" => HEXLOWER.encode(hash::<Sha512>(&s).as_bstr()),
 | 
			
		||||
            _ => return Err(ErrorKind::UnknownHashType(s.into())),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        Ok(Value::from(encoded_hash))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[builtin("head")]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue