diff --git a/Cargo.lock b/Cargo.lock index b460660..82d8ca9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -223,6 +223,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + [[package]] name = "blocking" version = "1.1.0" @@ -282,6 +291,15 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-utils" version = "0.8.7" @@ -292,6 +310,16 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "ctor" version = "0.1.21" @@ -302,6 +330,16 @@ dependencies = [ "syn", ] +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dirs" version = "2.0.2" @@ -448,6 +486,16 @@ version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "get_if_addrs" version = "0.5.3" @@ -507,6 +555,7 @@ dependencies = [ "kuska-ssb", "serde", "serde_json", + "sha2", ] [[package]] @@ -814,6 +863,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + [[package]] name = "signal-hook" version = "0.3.13" @@ -880,6 +940,12 @@ dependencies = [ "syn", ] +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index 6b62620..7f385c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,4 @@ kuska-sodiumoxide = "0.2.5-0" kuska-ssb = "0.4.0" serde = { version = "1", features = ["derive"] } serde_json = "1" +sha2 = "0.10.2" diff --git a/src/blobs.rs b/src/blobs.rs index a4fb125..0c9f057 100644 --- a/src/blobs.rs +++ b/src/blobs.rs @@ -3,6 +3,10 @@ //! Offers the following functions: //! //! - [`get_blob_path()`] +//! - [`hash_blob()`] + +use base64; +use sha2::{Digest, Sha256}; use crate::error::GolgiError; @@ -54,3 +58,27 @@ pub fn get_blob_path(blob_id: &str) -> Result { Ok(blob_path) } + +/// Hash the given blob byte slice and return the hex representation and +/// blob ID (sigil-link). +/// +/// This function can be used when adding a blob to the local blobstore. +pub fn hash_blob(buffer: &[u8]) -> Result<(String, String), GolgiError> { + // hash the bytes + let hash = Sha256::digest(buffer); + + // generate a hex representation of the hash + let hex_hash = format!("{:02x?}", hash) + .replace('[', "") + .replace(']', "") + .replace(',', "") + .replace(' ', ""); + + // encode the hash + let b64_hash = base64::encode(&hash[..]); + + // format the base64 encoding as a blob sigil-link (blob id) + let blob_id = format!("&{}.sha256", b64_hash); + + Ok((hex_hash, blob_id)) +}