From a7edc931d96e10822cc6952b10900d012070c85c Mon Sep 17 00:00:00 2001 From: = Date: Tue, 26 Nov 2024 16:56:37 +0100 Subject: [PATCH 1/5] Add struct for smb functions --- rust/src/nasl/builtin/cryptographic/mod.rs | 2 + rust/src/nasl/builtin/cryptographic/smb.rs | 45 +++++++++++++++++++ .../nasl/builtin/cryptographic/tests/mod.rs | 1 + .../nasl/builtin/cryptographic/tests/smb.rs | 16 +++++++ 4 files changed, 64 insertions(+) create mode 100644 rust/src/nasl/builtin/cryptographic/smb.rs create mode 100644 rust/src/nasl/builtin/cryptographic/tests/smb.rs diff --git a/rust/src/nasl/builtin/cryptographic/mod.rs b/rust/src/nasl/builtin/cryptographic/mod.rs index 06cfad2aa..dbae038ed 100644 --- a/rust/src/nasl/builtin/cryptographic/mod.rs +++ b/rust/src/nasl/builtin/cryptographic/mod.rs @@ -20,6 +20,7 @@ pub mod hash; pub mod hmac; pub mod rc4; pub mod rsa; +pub mod smb; #[cfg(test)] mod tests; @@ -123,6 +124,7 @@ impl IntoFunctionSet for Cryptographic { set.add_set(des::Des); set.add_set(rsa::Rsa); set.add_set(bf_cbc::BfCbc); + set.add_set(smb::SMB); set } } diff --git a/rust/src/nasl/builtin/cryptographic/smb.rs b/rust/src/nasl/builtin/cryptographic/smb.rs new file mode 100644 index 000000000..da03911e1 --- /dev/null +++ b/rust/src/nasl/builtin/cryptographic/smb.rs @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2024 Greenbone AG +// + +// SPDX-License-Identifier: GPL-2.0-or-later +use crate::function_set; +use crate::nasl::FunctionErrorKind; +use crate::nasl::NaslValue; +use aes::Aes128; +use aes_gcm::aead::{Aead, KeyInit}; +use aes_gcm::{Aes128Gcm, Nonce}; +use cmac::Cmac; +use digest::Update; +use nasl_function_proc_macro::nasl_function; + +#[nasl_function(named(key, buf))] +fn smb_cmac_aes_signature(key: &str, buf: &str) -> Result { + let key_bytes = key.as_bytes(); + let buf_bytes = buf.as_bytes(); + let mut cmac = Cmac::::new_from_slice(&key_bytes) + .map_err(|e| FunctionErrorKind::Diagnostic(e.to_string(), None))?; + cmac.update(buf_bytes); + let finish = cmac::Mac::finalize(cmac).into_bytes(); + Ok(finish.to_vec().into()) +} + +#[nasl_function(named(key, buf, iv))] +fn smb_gmac_aes_signature(key: &str, buf: &str, iv: &str) -> Result { + let key_bytes = key.as_bytes(); + let buf_bytes = buf.as_bytes(); + let iv_bytes = iv.as_bytes(); + let gmac = Aes128Gcm::new_from_slice(&key_bytes).unwrap(); + let nonce = Nonce::from_slice(&iv_bytes); + let auth = gmac.encrypt(nonce, buf_bytes.as_ref()).unwrap(); + Ok(auth.into()) +} + +pub struct SMB; +function_set! { + SMB, + sync_stateless, + ( + (smb_gmac_aes_signature, "smb_gmac_aes_signature"), + (smb_cmac_aes_signature, "smb_cmac_aes_signature"), + ) +} diff --git a/rust/src/nasl/builtin/cryptographic/tests/mod.rs b/rust/src/nasl/builtin/cryptographic/tests/mod.rs index b9ec1aca2..b6ab672e4 100644 --- a/rust/src/nasl/builtin/cryptographic/tests/mod.rs +++ b/rust/src/nasl/builtin/cryptographic/tests/mod.rs @@ -10,3 +10,4 @@ mod helper; mod hmac; mod rc4; mod rsa; +mod smb; diff --git a/rust/src/nasl/builtin/cryptographic/tests/smb.rs b/rust/src/nasl/builtin/cryptographic/tests/smb.rs new file mode 100644 index 000000000..15825b57a --- /dev/null +++ b/rust/src/nasl/builtin/cryptographic/tests/smb.rs @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: 2024 Greenbone AG +// +// SPDX-License-Identifier: GPL-2.0-or-later + +#[cfg(test)] +mod tests { + + use crate::nasl::builtin::cryptographic::tests::helper::decode_hex; + use crate::nasl::test_prelude::*; + use crate::nasl::test_utils::TestBuilder; + + #[test] + fn smb_cmac_aes_signature() { + let mut t = TestBuilder::default(); + } +} From dcdff4c76e3359108355ce4453551bd0960fb98e Mon Sep 17 00:00:00 2001 From: = Date: Tue, 26 Nov 2024 17:13:04 +0100 Subject: [PATCH 2/5] fix cargo clippy warning --- rust/src/nasl/builtin/cryptographic/mod.rs | 2 +- rust/src/nasl/builtin/cryptographic/smb.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/src/nasl/builtin/cryptographic/mod.rs b/rust/src/nasl/builtin/cryptographic/mod.rs index dbae038ed..240523af2 100644 --- a/rust/src/nasl/builtin/cryptographic/mod.rs +++ b/rust/src/nasl/builtin/cryptographic/mod.rs @@ -124,7 +124,7 @@ impl IntoFunctionSet for Cryptographic { set.add_set(des::Des); set.add_set(rsa::Rsa); set.add_set(bf_cbc::BfCbc); - set.add_set(smb::SMB); + set.add_set(smb::Smb); set } } diff --git a/rust/src/nasl/builtin/cryptographic/smb.rs b/rust/src/nasl/builtin/cryptographic/smb.rs index da03911e1..5995ab3bc 100644 --- a/rust/src/nasl/builtin/cryptographic/smb.rs +++ b/rust/src/nasl/builtin/cryptographic/smb.rs @@ -34,9 +34,9 @@ fn smb_gmac_aes_signature(key: &str, buf: &str, iv: &str) -> Result Date: Wed, 27 Nov 2024 17:38:08 +0100 Subject: [PATCH 3/5] Added test for smb_cmac_aes_signature and smb_gmac_aes_signature --- rust/src/nasl/builtin/cryptographic/smb.rs | 6 +++--- .../src/nasl/builtin/cryptographic/tests/smb.rs | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/rust/src/nasl/builtin/cryptographic/smb.rs b/rust/src/nasl/builtin/cryptographic/smb.rs index 5995ab3bc..b33fa7a96 100644 --- a/rust/src/nasl/builtin/cryptographic/smb.rs +++ b/rust/src/nasl/builtin/cryptographic/smb.rs @@ -16,7 +16,7 @@ use nasl_function_proc_macro::nasl_function; fn smb_cmac_aes_signature(key: &str, buf: &str) -> Result { let key_bytes = key.as_bytes(); let buf_bytes = buf.as_bytes(); - let mut cmac = Cmac::::new_from_slice(&key_bytes) + let mut cmac = Cmac::::new_from_slice(key_bytes) .map_err(|e| FunctionErrorKind::Diagnostic(e.to_string(), None))?; cmac.update(buf_bytes); let finish = cmac::Mac::finalize(cmac).into_bytes(); @@ -28,8 +28,8 @@ fn smb_gmac_aes_signature(key: &str, buf: &str, iv: &str) -> Result Date: Wed, 4 Dec 2024 21:36:22 +0100 Subject: [PATCH 4/5] Add smb3kdf and some changes in hash function and test --- rust/src/nasl/builtin/cryptographic/smb.rs | 44 +++++++++++++++++-- .../nasl/builtin/cryptographic/tests/smb.rs | 15 ++++++- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/rust/src/nasl/builtin/cryptographic/smb.rs b/rust/src/nasl/builtin/cryptographic/smb.rs index b33fa7a96..d57c3fc81 100644 --- a/rust/src/nasl/builtin/cryptographic/smb.rs +++ b/rust/src/nasl/builtin/cryptographic/smb.rs @@ -9,17 +9,20 @@ use aes::Aes128; use aes_gcm::aead::{Aead, KeyInit}; use aes_gcm::{Aes128Gcm, Nonce}; use cmac::Cmac; -use digest::Update; +use cmac::Mac; +use digest::InvalidLength; +use hmac::Hmac; use nasl_function_proc_macro::nasl_function; +use sha2::Sha256; #[nasl_function(named(key, buf))] fn smb_cmac_aes_signature(key: &str, buf: &str) -> Result { let key_bytes = key.as_bytes(); let buf_bytes = buf.as_bytes(); - let mut cmac = Cmac::::new_from_slice(key_bytes) + let mut cmac_obj = as KeyInit>::new_from_slice(key_bytes) .map_err(|e| FunctionErrorKind::Diagnostic(e.to_string(), None))?; - cmac.update(buf_bytes); - let finish = cmac::Mac::finalize(cmac).into_bytes(); + Mac::update(&mut cmac_obj, buf_bytes); + let finish = cmac::Mac::finalize(cmac_obj).into_bytes(); Ok(finish.to_vec().into()) } @@ -33,6 +36,38 @@ fn smb_gmac_aes_signature(key: &str, buf: &str, iv: &str) -> Result Result { + let key_bytes = key.as_bytes(); + let label_bytes = label.as_bytes(); + let ctx_bytes = ctx.as_bytes(); + let mut mac_obj = match as KeyInit>::new_from_slice(key_bytes) { + Ok(x) => x, + Err(InvalidLength) => { + return Err(FunctionErrorKind::wrong_unnamed_argument( + "valid size key", + "invalid size key", + )) + } + }; + if lvalue != 128 && lvalue != 256 { + return Err(FunctionErrorKind::wrong_argument( + "valid size key", + format!("{:?}", "128 or 256").as_str(), + lvalue.to_string().as_str(), + )); + } + let concat = [label_bytes, ctx_bytes].concat(); + Mac::update(&mut mac_obj, &concat); + let output = mac_obj.finalize().into_bytes(); + let return_key = &output[..lvalue.min(output.len())]; + Ok(return_key.into()) +} pub struct Smb; function_set! { @@ -41,5 +76,6 @@ function_set! { ( (smb_gmac_aes_signature, "smb_gmac_aes_signature"), (smb_cmac_aes_signature, "smb_cmac_aes_signature"), + (smb3kdf, "smb3kdf"), ) } diff --git a/rust/src/nasl/builtin/cryptographic/tests/smb.rs b/rust/src/nasl/builtin/cryptographic/tests/smb.rs index 0adb7beae..6625650bf 100644 --- a/rust/src/nasl/builtin/cryptographic/tests/smb.rs +++ b/rust/src/nasl/builtin/cryptographic/tests/smb.rs @@ -24,10 +24,23 @@ mod tests { let mut t = TestBuilder::default(); t.run(r#"key = "1274637383948293";"#); t.run(r#"buf = "1274637383948293";"#); - t.run(r#"iv = "28374928";"#); + t.run(r#"iv = "127463738394";"#); t.ok( r#"smb_gmac_aes_signature(key:key,buf:buf,iv:iv);"#, NaslValue::Data(decode_hex("73C1B26E84FFC51037E057734B8AC8E2").unwrap()), ); } + #[test] + fn smb3kdf() { + let mut t = TestBuilder::default(); + t.run(r#"key = "1274637383948293";"#); + t.run(r#"label = "1274637383948293";"#); + t.run(r#"ctx = "28374928";"#); + t.run(r#"lvalue = 128;"#); + t.run(r#"display(smb3kdf(key:key,label:label,ctx:ctx,lvalue:lvalue));"#); + t.ok( + r#"smb3kdf(key:key,label:label,ctx:ctx,lvalue:lvalue);"#, + NaslValue::Data(decode_hex("73C1B26E84FFC51037E057734B8AC8E2").unwrap()), + ); + } } From f16648dba7df20e153792bd05dd53d1a2000176e Mon Sep 17 00:00:00 2001 From: = Date: Wed, 18 Dec 2024 12:57:31 +0100 Subject: [PATCH 5/5] change smb3kdf --- rust/src/nasl/builtin/cryptographic/smb.rs | 17 ++++++++++++----- .../src/nasl/builtin/cryptographic/tests/smb.rs | 5 +++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/rust/src/nasl/builtin/cryptographic/smb.rs b/rust/src/nasl/builtin/cryptographic/smb.rs index d57c3fc81..030ba00db 100644 --- a/rust/src/nasl/builtin/cryptographic/smb.rs +++ b/rust/src/nasl/builtin/cryptographic/smb.rs @@ -62,11 +62,18 @@ fn smb3kdf( lvalue.to_string().as_str(), )); } - let concat = [label_bytes, ctx_bytes].concat(); - Mac::update(&mut mac_obj, &concat); - let output = mac_obj.finalize().into_bytes(); - let return_key = &output[..lvalue.min(output.len())]; - Ok(return_key.into()) + let buflen = 4 + label_bytes.len() + 1 + ctx_bytes.len(); + let mut buf = Vec::with_capacity(buflen); + + buf.extend_from_slice(&1u32.to_be_bytes()); + buf.extend_from_slice(label_bytes); + buf.push(0); + buf.extend_from_slice(ctx_bytes); + buf.extend_from_slice(&lvalue.to_be_bytes()); + mac_obj.update(&buf); + let result = mac_obj.finalize().into_bytes(); + let resultlen = (lvalue / 8) as usize; + Ok(result[..resultlen].into()) } pub struct Smb; diff --git a/rust/src/nasl/builtin/cryptographic/tests/smb.rs b/rust/src/nasl/builtin/cryptographic/tests/smb.rs index 6625650bf..d438e23dd 100644 --- a/rust/src/nasl/builtin/cryptographic/tests/smb.rs +++ b/rust/src/nasl/builtin/cryptographic/tests/smb.rs @@ -32,8 +32,9 @@ mod tests { } #[test] fn smb3kdf() { - let mut t = TestBuilder::default(); - t.run(r#"key = "1274637383948293";"#); + let mut t: TestBuilder = + TestBuilder::default(); + t.run(r#"key = "jfehfiuhf497hfiuhwf497g74gf97wh4u97hg";"#); t.run(r#"label = "1274637383948293";"#); t.run(r#"ctx = "28374928";"#); t.run(r#"lvalue = 128;"#);