use crypto_wasi::{ hkdf, hkdf_hmac, pbkdf2, scrypt, utils::{decrypt, encrypt, hash, hex_to_u8array, hmac, u8array_to_hex}, Cipheriv, CryptoErrno, Decipheriv, Hash, Hmac, }; #[test] fn test_hkdf() { let cases256 = [( "sha256", "secret", "salt", "info", 64, "f6d2fcc47cb939deafe3853a1e641a27e6924aff7a63d09cb04ccfffbe4776efdda39ae362b1346092d8cb4ee3f0ea74b84000e40066194ffca55d2128aa6c1a", ), ( "sha256", "secret", "salt", "info", 32, "f6d2fcc47cb939deafe3853a1e641a27e6924aff7a63d09cb04ccfffbe4776ef", ), ( "sha256", "", "", "", 32, "eb70f01dede9afafa449eee1b1286504e1f62388b3f7dd4f956697b0e828fe18", ), ( "sha256", "", "", "", 48, "eb70f01dede9afafa449eee1b1286504e1f62388b3f7dd4f956697b0e828fe181e59c2ec0fe6e7e7ac2613b6ab65342a", )]; for (digest, key, salt, info, key_len, execpt) in cases256 { assert_eq!( hkdf(digest, key, salt, info, key_len).map(u8array_to_hex), Ok(execpt.to_string()) ); assert_eq!( hkdf_hmac(digest, key, salt, info, key_len).map(u8array_to_hex), Ok(execpt.to_string()) ); } let cases512 = [( "sha512", b"secret", b"salt", b"", 128, "683045181e6325bbd2a5ba7fc5cecc3bf0d9bfe0963c3943867cf19c2b5de335faf87a0ad2a75688c78f63dc812a3c5d3ce29ed20ddadaf0edfb985789c66c9077c77c510e1806d3a8affb05d18e3d4c428afcadc968e80c50da7072da4ef446d1c28c6e3facba31809575fe74796cf4fde7238d9cc666b83ec08a0c5125bc9e", ), ( "sha512", b"secret", b"salt", b"", 64, "683045181e6325bbd2a5ba7fc5cecc3bf0d9bfe0963c3943867cf19c2b5de335faf87a0ad2a75688c78f63dc812a3c5d3ce29ed20ddadaf0edfb985789c66c90", )]; for (digest, key, salt, info, key_len, execpt) in cases512 { if key_len == 64 { assert_eq!( hkdf(digest, key, salt, info, key_len).map(u8array_to_hex), Ok(execpt.to_string()) ); } assert_eq!( hkdf_hmac(digest, key, salt, info, key_len).map(u8array_to_hex), Ok(execpt.to_string()) ); } } #[test] fn test_pbkdf2() { let cases = [ ( "password", "salt", 1, 20, "120fb6cffcf8b32c43e7225256c4f837a86548c9", ), ( "password", "salt", 2, 20, "ae4d0c95af6b46d32d0adff928f06dd02a303f8e", ), ( "password", "salt", 4096, 20, "c5e478d59288c841aa530db6845c4c8d962893a0", ), ( "passwordPASSWORDpassword", "saltSALTsaltSALTsaltSALTsaltSALTsalt", 4096, 25, "348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c", ), ( "pass\0word", "sa\0lt", 4096, 16, "89b69d0516f829893c696226650a8687", ), ( "password", "salt", 32, 32, "64c486c55d30d4c5a079b8823b7d7cb37ff0556f537da8410233bcec330ed956", ), ]; for (password, salt, iters, key_len, except) in cases { assert_eq!( pbkdf2(password, salt, iters, key_len, "sha256").map(u8array_to_hex), Ok(except.to_string()) ); } } #[test] fn test_hmac() { let cases = [ ( "key", "The quick brown fox jumps over the lazy dog", "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8", ), ( "key", "", "5d5d139563c95b5967b9bd9a8c9b233a9dedb45072794cd232dc1b74832607d0", ), ( "", "The quick brown fox jumps over the lazy dog", "fb011e6154a19b9a4c767373c305275a5a69e8b68b0b4c9200c383dced19a416", ), ( "", "", "b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad", ), ]; for (key, info, except) in cases { assert_eq!( hmac("sha256", key, &[info]).map(u8array_to_hex), Ok(except.to_string()) ); let mut h = Hmac::create("sha256", key).unwrap(); let half = info.len(); h.update(&info[..half]).unwrap(); h.update(&info[half..]).unwrap(); assert_eq!(h.digest().map(u8array_to_hex), Ok(except.to_string())); } assert_eq!( hmac( "sha256", b"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", &[b"\x48\x69\x20\x54\x68\x65\x72\x65"] ) .map(u8array_to_hex), Ok("b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7".to_string()) ); assert_eq!( hmac( "sha512", b"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", &[b"\x48\x69\x20\x54\x68\x65\x72\x65"] ) .map(u8array_to_hex), Ok("87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854".to_string()) ); } #[test] fn test_scrypt() { let cases = [ ( "", "", 64, 16, 1, 1, "77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906", ), ( "password", "NaCl", 64, 1024, 16, 8, "fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640", ), ( "pleaseletmein", "SodiumChloride", 64, 16384, 1, 8, "7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887", ), ( "", "", 64, 16, 1, 1, "77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906", ), ( "password", "NaCl", 64, 1024, 16, 8, "fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640", ), ( "pleaseletmein", "SodiumChloride", 64, 16384, 1, 8, "7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887", ), ]; for (password, salt, key_len, n, p, r, except) in cases { assert_eq!( scrypt(password, salt, n, r, p, key_len).map(u8array_to_hex), Ok(except.to_string()) ); } } #[test] fn test_hash() { let cases = [( "sha512", "УТФ-8 text", "4b21bbd1a68e690a730ddcb5a8bc94ead9879ffe82580767ad7ec6fa8ba2dea643a821af66afa9a45b6a78c712fecf0e56dc7f43aef4bcfc8eb5b4d8dca6ea5b", )]; for (alg, data, except) in cases { assert_eq!( hash(alg, &[data]).map(u8array_to_hex), Ok(except.to_string()) ); let mut h = Hash::create(alg).unwrap(); let half = data.len(); h.update(&data[..half]).unwrap(); let mut h2 = h.copy().unwrap(); h.digest().unwrap(); h2.update(&data[half..]).unwrap(); assert_eq!(h2.digest().map(u8array_to_hex), Ok(except.to_string())); } } #[test] fn test_cipher() { let cases = [ ( "aes-128-gcm", "0123456789abcdef", "000000000000", "additional data", "message", "98b59a86e8d580", "f7d5c00f382a5de63a35bd8c3f7ba831", ), ( "aes-128-gcm", "0123456789abcdef", "000000000000", "", "message", "98b59a86e8d580", "6ac19ea404f15be37f2f4cfb0998c0b6", ), ]; for (alg, key, iv, aad, msg, enc, tag) in cases { assert_eq!( encrypt(alg, key, iv, aad, msg).map(|(a, b)| (u8array_to_hex(a), u8array_to_hex(b))), Ok((enc.to_string(), tag.to_string())) ); assert_eq!( || -> Result<(String, String), CryptoErrno> { let mut c = Cipheriv::create(alg, key, iv)?; c.set_aad(aad)?; c.update(msg)?; let out = c.fin()?; let auth = c.get_auth_tag()?; Ok((u8array_to_hex(out), u8array_to_hex(auth))) }(), Ok((enc.to_string(), tag.to_string())) ); assert_eq!( decrypt( alg, key, iv, aad, hex_to_u8array(tag).unwrap(), hex_to_u8array(enc).unwrap() ), Ok(msg.as_bytes().to_vec()) ); assert_eq!( || -> Result, CryptoErrno> { let mut c = Decipheriv::create(alg, key, iv)?; c.set_aad(aad)?; c.set_auth_tag(hex_to_u8array(tag).unwrap())?; c.update(hex_to_u8array(enc).unwrap())?; c.fin() }(), Ok(msg.as_bytes().to_vec()) ); } }