From 5c3065b43a61a5fa019cbbb157984fc5eb81d439 Mon Sep 17 00:00:00 2001 From: Padraic-O-Mhuiris Date: Wed, 21 Feb 2024 16:49:07 +0000 Subject: 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 --- tvix/Cargo.lock | 25 ++++++ tvix/Cargo.nix | 90 ++++++++++++++++++++ tvix/eval/Cargo.toml | 4 + tvix/eval/docs/builtins.md | 2 +- tvix/eval/src/builtins/mod.rs | 32 ++++++-- tvix/eval/src/errors.rs | 10 +++ .../eval/src/tests/nix_tests/eval-okay-groupBy.exp | 1 + .../eval/src/tests/nix_tests/eval-okay-groupBy.nix | 5 ++ .../src/tests/nix_tests/eval-okay-hashstring.exp | 1 + .../src/tests/nix_tests/eval-okay-hashstring.nix | 4 + .../nix_tests/notyetpassing/eval-okay-groupBy.exp | 1 - .../nix_tests/notyetpassing/eval-okay-groupBy.nix | 5 -- .../notyetpassing/eval-okay-hashstring.exp | 1 - .../notyetpassing/eval-okay-hashstring.nix | 4 - .../tvix_tests/eval-okay-builtins-hashString.exp | 1 + .../tvix_tests/eval-okay-builtins-hashString.nix | 6 ++ tvix/eval/src/value/string.rs | 6 ++ web/tvixbolt/Cargo.lock | 96 ++++++++++++++++++++++ 18 files changed, 273 insertions(+), 21 deletions(-) create mode 100644 tvix/eval/src/tests/nix_tests/eval-okay-groupBy.exp create mode 100644 tvix/eval/src/tests/nix_tests/eval-okay-groupBy.nix create mode 100644 tvix/eval/src/tests/nix_tests/eval-okay-hashstring.exp create mode 100644 tvix/eval/src/tests/nix_tests/eval-okay-hashstring.nix delete mode 100644 tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.exp delete mode 100644 tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.nix delete mode 100644 tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.exp delete mode 100644 tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.nix create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.nix diff --git a/tvix/Cargo.lock b/tvix/Cargo.lock index 585199440b1e..7995402ead4a 100644 --- a/tvix/Cargo.lock +++ b/tvix/Cargo.lock @@ -1416,6 +1416,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.1" @@ -2543,6 +2553,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -3346,12 +3367,14 @@ dependencies = [ "codemap", "codemap-diagnostic", "criterion", + "data-encoding", "dirs", "genawaiter", "imbl", "itertools 0.12.0", "lazy_static", "lexical-core", + "md-5", "os_str_bytes", "path-clean", "pretty_assertions", @@ -3362,6 +3385,8 @@ dependencies = [ "rstest", "serde", "serde_json", + "sha1", + "sha2", "smol_str", "tabwriter", "tempfile", diff --git a/tvix/Cargo.nix b/tvix/Cargo.nix index b0c36524e472..9ee11cbd94f7 100644 --- a/tvix/Cargo.nix +++ b/tvix/Cargo.nix @@ -4191,6 +4191,41 @@ rec { features = { }; resolvedDefaultFeatures = [ "default" ]; }; + "md-5" = rec { + crateName = "md-5"; + version = "0.10.6"; + edition = "2018"; + sha256 = "1kvq5rnpm4fzwmyv5nmnxygdhhb2369888a06gdc9pxyrzh7x7nq"; + libName = "md5"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "digest"; + packageId = "digest"; + } + ]; + devDependencies = [ + { + name = "digest"; + packageId = "digest"; + features = [ "dev" ]; + } + ]; + features = { + "asm" = [ "md5-asm" ]; + "default" = [ "std" ]; + "md5-asm" = [ "dep:md5-asm" ]; + "oid" = [ "digest/oid" ]; + "std" = [ "digest/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "memchr" = rec { crateName = "memchr"; version = "2.7.1"; @@ -7763,6 +7798,45 @@ rec { ]; }; + "sha1" = rec { + crateName = "sha1"; + version = "0.10.6"; + edition = "2018"; + sha256 = "1fnnxlfg08xhkmwf2ahv634as30l1i3xhlhkvxflmasi5nd85gz3"; + authors = [ + "RustCrypto Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "cpufeatures"; + packageId = "cpufeatures"; + target = { target, features }: (("aarch64" == target."arch" or null) || ("x86" == target."arch" or null) || ("x86_64" == target."arch" or null)); + } + { + name = "digest"; + packageId = "digest"; + } + ]; + devDependencies = [ + { + name = "digest"; + packageId = "digest"; + features = [ "dev" ]; + } + ]; + features = { + "asm" = [ "sha1-asm" ]; + "default" = [ "std" ]; + "oid" = [ "digest/oid" ]; + "sha1-asm" = [ "dep:sha1-asm" ]; + "std" = [ "digest/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "sha2" = rec { crateName = "sha2"; version = "0.10.8"; @@ -10493,6 +10567,10 @@ rec { name = "codemap-diagnostic"; packageId = "codemap-diagnostic"; } + { + name = "data-encoding"; + packageId = "data-encoding"; + } { name = "dirs"; packageId = "dirs"; @@ -10520,6 +10598,10 @@ rec { packageId = "lexical-core"; features = [ "format" "parse-floats" ]; } + { + name = "md-5"; + packageId = "md-5"; + } { name = "os_str_bytes"; packageId = "os_str_bytes"; @@ -10557,6 +10639,14 @@ rec { name = "serde_json"; packageId = "serde_json"; } + { + name = "sha1"; + packageId = "sha1"; + } + { + name = "sha2"; + packageId = "sha2"; + } { name = "smol_str"; packageId = "smol_str"; diff --git a/tvix/eval/Cargo.toml b/tvix/eval/Cargo.toml index 4f4551a349d2..e2bd07f8279f 100644 --- a/tvix/eval/Cargo.toml +++ b/tvix/eval/Cargo.toml @@ -33,6 +33,10 @@ tabwriter = "1.2" test-strategy = { version = "0.2.1", optional = true } toml = "0.6.0" xml-rs = "0.8.4" +sha2 = "0.10.8" +sha1 = "0.10.6" +md-5 = "0.10.6" +data-encoding = "2.5.0" [dev-dependencies] criterion = "0.5" diff --git a/tvix/eval/docs/builtins.md b/tvix/eval/docs/builtins.md index 39b59437e26b..eff761c7057d 100644 --- a/tvix/eval/docs/builtins.md +++ b/tvix/eval/docs/builtins.md @@ -66,7 +66,7 @@ The `impl` column indicates implementation status in tvix: | hasAttr | false | | | | | hasContext | false | | | | | hashFile | false | | false | todo | -| hashString | false | | | todo | +| hashString | false | | | | | head | false | | | | | import | true | | | | | intersectAttrs | false | | | | diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 131f2b7bb201..119c0bda2dc3 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -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 { - // FIXME: propagate contexts here. - Ok(Value::from(CatchableErrorKind::UnimplementedFeature( - "hashString".into(), - ))) + async fn builtin_hashString(co: GenCo, algo: Value, s: Value) -> Result { + fn hash(b: &[u8]) -> Output { + 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::(&s).as_bstr()), + b"sha1" => HEXLOWER.encode(hash::(&s).as_bstr()), + b"sha256" => HEXLOWER.encode(hash::(&s).as_bstr()), + b"sha512" => HEXLOWER.encode(hash::(&s).as_bstr()), + _ => return Err(ErrorKind::UnknownHashType(s.into())), + }; + + Ok(Value::from(encoded_hash)) } #[builtin("head")] diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs index db02093b8d65..652252dadfa0 100644 --- a/tvix/eval/src/errors.rs +++ b/tvix/eval/src/errors.rs @@ -229,6 +229,10 @@ pub enum ErrorKind { /// tvix-eval when returning a result to the user, never inside of /// eval code. CatchableError(CatchableErrorKind), + + /// Invalid hash type specified, must be one of "md5", "sha1", "sha256" + /// or "sha512" + UnknownHashType(String), } impl error::Error for Error { @@ -533,6 +537,10 @@ to a missing value in the attribute set(s) included via `with`."#, ErrorKind::CatchableError(inner) => { write!(f, "{}", inner) } + + ErrorKind::UnknownHashType(hash_type) => { + write!(f, "unknown hash type '{}'", hash_type) + } } } } @@ -821,6 +829,7 @@ impl Error { | ErrorKind::TvixBug { .. } | ErrorKind::NotImplemented(_) | ErrorKind::WithContext { .. } + | ErrorKind::UnknownHashType(_) | ErrorKind::CatchableError(_) => return None, }; @@ -866,6 +875,7 @@ impl Error { ErrorKind::NotSerialisableToJson(_) => "E036", ErrorKind::UnexpectedContext => "E037", ErrorKind::Utf8 => "E038", + ErrorKind::UnknownHashType(_) => "E039", // Special error code for errors from other Tvix // components. We may want to introduce a code namespacing diff --git a/tvix/eval/src/tests/nix_tests/eval-okay-groupBy.exp b/tvix/eval/src/tests/nix_tests/eval-okay-groupBy.exp new file mode 100644 index 000000000000..bfca5652a59b --- /dev/null +++ b/tvix/eval/src/tests/nix_tests/eval-okay-groupBy.exp @@ -0,0 +1 @@ +{ "1" = [ 9 ]; "2" = [ 8 ]; "3" = [ 13 29 ]; "4" = [ 3 4 10 11 17 18 ]; "5" = [ 0 23 26 28 ]; "6" = [ 1 12 21 27 30 ]; "7" = [ 7 22 ]; "8" = [ 14 ]; "9" = [ 19 ]; b = [ 16 25 ]; c = [ 24 ]; d = [ 2 ]; e = [ 5 6 15 31 ]; f = [ 20 ]; } diff --git a/tvix/eval/src/tests/nix_tests/eval-okay-groupBy.nix b/tvix/eval/src/tests/nix_tests/eval-okay-groupBy.nix new file mode 100644 index 000000000000..862d89dbd670 --- /dev/null +++ b/tvix/eval/src/tests/nix_tests/eval-okay-groupBy.nix @@ -0,0 +1,5 @@ +with import ./lib.nix; + +builtins.groupBy (n: + builtins.substring 0 1 (builtins.hashString "sha256" (toString n)) +) (range 0 31) diff --git a/tvix/eval/src/tests/nix_tests/eval-okay-hashstring.exp b/tvix/eval/src/tests/nix_tests/eval-okay-hashstring.exp new file mode 100644 index 000000000000..d720a082ddb3 --- /dev/null +++ b/tvix/eval/src/tests/nix_tests/eval-okay-hashstring.exp @@ -0,0 +1 @@ +[ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ] diff --git a/tvix/eval/src/tests/nix_tests/eval-okay-hashstring.nix b/tvix/eval/src/tests/nix_tests/eval-okay-hashstring.nix new file mode 100644 index 000000000000..b0f62b245ca8 --- /dev/null +++ b/tvix/eval/src/tests/nix_tests/eval-okay-hashstring.nix @@ -0,0 +1,4 @@ +let + strings = [ "" "text 1" "text 2" ]; +in + builtins.concatLists (map (hash: map (builtins.hashString hash) strings) ["md5" "sha1" "sha256" "sha512"]) diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.exp b/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.exp deleted file mode 100644 index bfca5652a59b..000000000000 --- a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.exp +++ /dev/null @@ -1 +0,0 @@ -{ "1" = [ 9 ]; "2" = [ 8 ]; "3" = [ 13 29 ]; "4" = [ 3 4 10 11 17 18 ]; "5" = [ 0 23 26 28 ]; "6" = [ 1 12 21 27 30 ]; "7" = [ 7 22 ]; "8" = [ 14 ]; "9" = [ 19 ]; b = [ 16 25 ]; c = [ 24 ]; d = [ 2 ]; e = [ 5 6 15 31 ]; f = [ 20 ]; } diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.nix b/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.nix deleted file mode 100644 index 7e0eab28b036..000000000000 --- a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-groupBy.nix +++ /dev/null @@ -1,5 +0,0 @@ -with import ./../lib.nix; - -builtins.groupBy (n: - builtins.substring 0 1 (builtins.hashString "sha256" (toString n)) -) (range 0 31) diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.exp b/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.exp deleted file mode 100644 index d720a082ddb3..000000000000 --- a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.exp +++ /dev/null @@ -1 +0,0 @@ -[ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ] diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.nix b/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.nix deleted file mode 100644 index b0f62b245ca8..000000000000 --- a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-hashstring.nix +++ /dev/null @@ -1,4 +0,0 @@ -let - strings = [ "" "text 1" "text 2" ]; -in - builtins.concatLists (map (hash: map (builtins.hashString hash) strings) ["md5" "sha1" "sha256" "sha512"]) diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.exp new file mode 100644 index 000000000000..e00b80e561fb --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.exp @@ -0,0 +1 @@ +[ "8a0614b4eaa4cffb7515ec101847e198" "8bd218cf61321d8aa05b3602b99f90d2d8cef3d6" "80ac06d74cb6c5d14af718ce8c3c1255969a1a595b76a3cf92354a95331a879a" "0edac513b6b0454705b553deda4c9b055da0939d26d2f73548862817ebeac5378cf64ff7a752ce1a0590a736735d3bbd9e8a7f04d93617cdf514313f5ab5baa4" ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.nix new file mode 100644 index 000000000000..aed723d3670a --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-hashString.nix @@ -0,0 +1,6 @@ +[ + (builtins.hashString "md5" "tvix") + (builtins.hashString "sha1" "tvix") + (builtins.hashString "sha256" "tvix") + (builtins.hashString "sha512" "tvix") +] diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs index 2f1592546b85..6ce0d190c0a0 100644 --- a/tvix/eval/src/value/string.rs +++ b/tvix/eval/src/value/string.rs @@ -524,6 +524,12 @@ impl<'a> From<&'a NixString> for &'a BStr { } } +impl From for String { + fn from(s: NixString) -> Self { + s.to_string() + } +} + impl From for BString { fn from(s: NixString) -> Self { s.as_bstr().to_owned() diff --git a/web/tvixbolt/Cargo.lock b/web/tvixbolt/Cargo.lock index 7c7afb63f95b..d3c5faf10c12 100644 --- a/web/tvixbolt/Cargo.lock +++ b/web/tvixbolt/Cargo.lock @@ -35,6 +35,15 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703642b98a00b3b90513279a8ede3fcfa479c126c5fb46e78f3051522f021403" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "boolinator" version = "2.4.0" @@ -102,6 +111,41 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dirs" version = "4.0.0" @@ -173,6 +217,16 @@ version = "0.99.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.12" @@ -458,6 +512,16 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.1" @@ -725,6 +789,28 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "slab" version = "0.4.9" @@ -857,12 +943,14 @@ dependencies = [ "bytes", "codemap", "codemap-diagnostic", + "data-encoding", "dirs", "genawaiter", "imbl", "itertools", "lazy_static", "lexical-core", + "md-5", "os_str_bytes", "path-clean", "regex", @@ -870,6 +958,8 @@ dependencies = [ "rowan", "serde", "serde_json", + "sha1", + "sha2", "smol_str", "tabwriter", "toml", @@ -901,6 +991,12 @@ dependencies = [ "yew-router", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.12" -- cgit 1.4.1