diff --git a/Cargo.lock b/Cargo.lock index 44464b7..a19b7ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,6 +86,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64ct" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" + [[package]] name = "bitflags" version = "1.3.2" @@ -173,10 +179,12 @@ dependencies = [ "lazy_static", "num-derive", "num-traits", - "openssl", + "pipe", "primitive-types 0.11.1", + "rand 0.8.5", "reqwest", "ring", + "rsa", "secp256k1 0.22.1", "serde", "serde_json", @@ -224,6 +232,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + [[package]] name = "convert_case" version = "0.4.0" @@ -264,12 +278,42 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if", + "lazy_static", +] + [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "crypto-common" version = "0.1.3" @@ -334,6 +378,17 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", + "crypto-bigint", + "pem-rfc7468", +] + [[package]] name = "derive_builder" version = "0.10.2" @@ -653,13 +708,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -839,7 +894,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.1.3", + "parity-scale-codec 3.1.5", ] [[package]] @@ -904,9 +959,9 @@ checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "js-sys" -version = "0.3.57" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -954,6 +1009,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -981,6 +1039,12 @@ dependencies = [ "rle-decode-fast", ] +[[package]] +name = "libm" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" + [[package]] name = "lock_api" version = "0.4.7" @@ -1070,6 +1134,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566d173b2f9406afbc5510a90925d5a2cd80cae4605631f1212303df265de011" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -1091,6 +1172,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -1098,6 +1190,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1154,15 +1247,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "openssl-src" -version = "111.20.0+1.1.1o" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92892c4f87d56e376e469ace79f1128fdaded07646ddf73aa0be4706ff712dec" -dependencies = [ - "cc", -] - [[package]] name = "openssl-sys" version = "0.9.74" @@ -1172,7 +1256,6 @@ dependencies = [ "autocfg", "cc", "libc", - "openssl-src", "pkg-config", "vcpkg", ] @@ -1193,9 +1276,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.1.3" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04bc9583b5e01cc8c70d89acc9af14ef9b1c29ee3a0074b2a9eea8c0fa396690" +checksum = "9182e4a71cae089267ab03e67c99368db7cd877baf50f931e5d6d4b71e195ac0" dependencies = [ "arrayvec", "bitvec 1.0.0", @@ -1252,6 +1335,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "pem-rfc7468" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01de5d978f34aa4b2296576379fcc416034702fd94117c56ffd8a1a767cefb30" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -1290,6 +1382,37 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pipe" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7b8f27da217eb966df4c58d4159ea939431950ca03cf782c22bd7c5c1d8d75" +dependencies = [ + "crossbeam-channel", +] + +[[package]] +name = "pkcs1" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78f66c04ccc83dd4486fd46c33896f4e17b24a7a3a6400dedc48ed0ddd72320" +dependencies = [ + "der", + "pkcs8", + "zeroize", +] + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + [[package]] name = "pkg-config" version = "0.3.25" @@ -1425,7 +1548,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", ] [[package]] @@ -1457,9 +1580,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64", "bytes", @@ -1484,6 +1607,7 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-native-tls", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -1522,6 +1646,26 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rsa" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf22754c49613d2b3b119f0e5d46e34a2c628a937e3024b8762de4e7d8c710b" +dependencies = [ + "byteorder", + "digest 0.10.3", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.3", + "smallvec", + "subtle", + "zeroize", +] + [[package]] name = "rustc-hex" version = "2.1.0" @@ -1785,6 +1929,16 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2080,9 +2234,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" [[package]] name = "unicode-normalization" @@ -2129,7 +2283,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "serde", ] @@ -2161,12 +2315,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2175,9 +2323,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2185,9 +2333,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -2200,9 +2348,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" dependencies = [ "cfg-if", "js-sys", @@ -2212,9 +2360,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2222,9 +2370,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -2235,15 +2383,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 266e5cb..cc6b566 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,10 +24,12 @@ jsonwebkey = { version = "0.3.4", features = [ "pkcs-convert" ] } lazy_static = "1.4.0" num-derive = "0.3.3" num-traits = "0.2.14" -openssl = { version = "0.10.40", features = ["vendored"] } -primitive-types = "0.11" -reqwest = { version = "0.11.9", features = [ "json" ] } +pipe = "0.4.0" +primitive-types = "0.11.1" +rand = "0.8.5" +reqwest = "0.11.11" ring = "0.16.20" +rsa = "0.6.1" secp256k1 = { version = "0.22.1", optional = true, features = [ "recovery" ] } serde = "1.0.132" serde_json = "1.0.73" diff --git a/src/deep_hash.rs b/src/deep_hash.rs index 1db06a1..471b8a7 100644 --- a/src/deep_hash.rs +++ b/src/deep_hash.rs @@ -2,7 +2,7 @@ use std::pin::Pin; use async_recursion::async_recursion; use bytes::Bytes; -use openssl::sha::Sha384; +use sha2::{Digest, Sha384}; use crate::error::BundlrError; use futures::{Stream, TryStream, TryStreamExt}; @@ -44,7 +44,7 @@ pub async fn deep_hash(chunk: DeepHashChunk) -> Result { let tagged_hash = [ sha384hash(tag.into()), - Bytes::copy_from_slice(&hasher.finish()), + Bytes::copy_from_slice(&hasher.finalize()), ] .concat(); @@ -81,5 +81,5 @@ pub async fn deep_hash_chunks( fn sha384hash(b: Bytes) -> Bytes { let mut hasher = Sha384::new(); hasher.update(&b); - Bytes::copy_from_slice(&hasher.finish()) + Bytes::copy_from_slice(&hasher.finalize()) } diff --git a/src/deep_hash_sync.rs b/src/deep_hash_sync.rs index 02d9dd6..90f479d 100644 --- a/src/deep_hash_sync.rs +++ b/src/deep_hash_sync.rs @@ -1,5 +1,5 @@ use bytes::Bytes; -use openssl::sha::Sha384; +use sha2::{Digest, Sha384}; use crate::{deep_hash::DeepHashChunk, error::BundlrError}; use futures::{Stream, TryStream}; @@ -49,5 +49,5 @@ pub fn deep_hash_chunks_sync( fn sha384hash(b: Bytes) -> Bytes { let mut hasher = Sha384::new(); hasher.update(&b); - Bytes::copy_from_slice(&hasher.finish()) + Bytes::copy_from_slice(&hasher.finalize()) } diff --git a/src/error.rs b/src/error.rs index d1724ab..9c74dc4 100644 --- a/src/error.rs +++ b/src/error.rs @@ -25,4 +25,7 @@ pub enum BundlrError { #[error("Response failed with the following error: {0}")] ResponseError(String), + + #[error("Failed to sign message: {0}")] + SigningError(String), } diff --git a/src/signers/arweave.rs b/src/signers/arweave.rs index 68220c2..fdc22b4 100644 --- a/src/signers/arweave.rs +++ b/src/signers/arweave.rs @@ -1,30 +1,30 @@ use crate::error::BundlrError; use bytes::Bytes; use data_encoding::BASE64URL; -use jwk::JsonWebKey; -use openssl::{ - hash::MessageDigest, - pkey::{PKey, Private}, - rsa::Padding, - sign, +use rand::thread_rng; +use rsa::{ + pkcs8::{DecodePrivateKey, DecodePublicKey}, + PaddingScheme, PublicKey, PublicKeyParts, RsaPrivateKey, RsaPublicKey, }; +use sha2::Digest; + extern crate jsonwebkey as jwk; use super::signer::{Signer, Verifier}; pub struct ArweaveSigner { - priv_key: PKey, + priv_key: RsaPrivateKey, } #[allow(unused)] impl ArweaveSigner { - fn new(priv_key: PKey) -> ArweaveSigner { + fn new(priv_key: RsaPrivateKey) -> ArweaveSigner { Self { priv_key } } fn from_jwk(jwk: jwk::JsonWebKey) -> ArweaveSigner { let pem = jwk.key.to_pem(); - let priv_key = PKey::private_key_from_pem(pem.as_bytes()).unwrap(); + let priv_key = RsaPrivateKey::from_pkcs8_pem(&pem).unwrap(); Self { priv_key } } @@ -35,17 +35,27 @@ impl Signer for ArweaveSigner { const SIG_LENGTH: u16 = 512; const PUB_LENGTH: u16 = 512; fn sign(&self, message: Bytes) -> Result { - let mut signer = sign::Signer::new(MessageDigest::sha256(), &self.priv_key).unwrap(); - signer.set_rsa_padding(Padding::PKCS1_PSS).unwrap(); - if signer.update(&message).is_err() { - return Err(BundlrError::NoBytesLeft); + let mut hasher = sha2::Sha256::new(); + hasher.update(&message); + let hashed = hasher.finalize(); + + let rng = thread_rng(); + let padding = PaddingScheme::PSS { + salt_rng: Box::new(rng), + digest: Box::new(sha2::Sha256::new()), + salt_len: None, }; - Ok(message) + let signature = self + .priv_key + .sign(padding, &hashed) + .map_err(|e| BundlrError::SigningError(e.to_string()))?; + + Ok(signature.into()) } fn pub_key(&self) -> Bytes { - self.priv_key.public_key_to_pem().unwrap().into() + self.priv_key.to_public_key().n().to_bytes_be().into() } } @@ -56,15 +66,21 @@ impl Verifier for ArweaveSigner { BASE64URL.encode(&pk[..]) ); let jwk: jwk::JsonWebKey = jwt_str.parse().unwrap(); - let p = serde_json::to_string(&jwk).unwrap(); - let key: JsonWebKey = p.parse().unwrap(); - - let pkey = PKey::public_key_from_der(key.key.to_der().as_slice()).unwrap(); - let mut verifier = sign::Verifier::new(MessageDigest::sha256(), &pkey).unwrap(); - verifier.set_rsa_padding(Padding::PKCS1_PSS).unwrap(); - verifier.update(&message[..]).unwrap(); - verifier - .verify(&signature[..]) + + let pub_key = RsaPublicKey::from_public_key_der(jwk.key.to_der().as_slice()).unwrap(); + let mut hasher = sha2::Sha256::new(); + hasher.update(&message); + let hashed = &hasher.finalize(); + + let rng = thread_rng(); + let padding = PaddingScheme::PSS { + salt_rng: Box::new(rng), + digest: Box::new(sha2::Sha256::new()), + salt_len: None, + }; + pub_key + .verify(padding, hashed, &signature) + .map(|_| true) .map_err(|_| BundlrError::InvalidSignature) } } @@ -74,21 +90,10 @@ mod tests { use crate::{ArweaveSigner, Signer, Verifier}; use bytes::Bytes; use jsonwebkey as jwk; - use openssl::{pkey::PKey, rsa::Rsa}; #[test] fn should_sign_and_verify() { let msg = Bytes::copy_from_slice(b"Hello, Bundlr!"); - - let rsa = Rsa::generate(4096).unwrap(); - let pkey = PKey::from_rsa(rsa).unwrap(); - let signer = ArweaveSigner::new(pkey); - - let sig = signer.sign(msg.clone()).unwrap(); - let pub_key = signer.pub_key(); - - assert!(ArweaveSigner::verify(pub_key, msg.clone(), sig).is_ok()); - let jwk_str = r#"{ "kty" : "RSA", "kid" : "cc34c0a0-bd5a-4a3c-a50d-a2a7db7643df",