use super::super::*;
#[test]
fn rejects_overlong_method_token_name() {
let script = vec![0x40];
let mut data = Vec::new();
data.extend_from_slice(&MAGIC);
data.extend_from_slice(&[0u8; 64]);
data.push(0); data.push(0);
data.push(1); data.extend_from_slice(&[0x22; 20]); write_varint(&mut data, (MAX_METHOD_NAME_LEN + 1) as u32);
data.push(0); data.push(0); data.push(0); data.push(0);
data.extend_from_slice(&0u16.to_le_bytes()); write_varint(&mut data, script.len() as u32);
data.extend_from_slice(&script);
let checksum = NefParser::calculate_checksum(&data);
data.extend_from_slice(&checksum.to_le_bytes());
let err = NefParser::new().parse(&data).unwrap_err();
assert!(matches!(
err,
crate::error::Error::Nef(NefError::InvalidMethodToken { .. })
));
}
#[test]
fn rejects_method_name_with_leading_underscore() {
let script = vec![0x40];
let mut data = Vec::new();
data.extend_from_slice(&MAGIC);
data.extend_from_slice(&[0u8; 64]);
data.push(0); data.push(0); data.push(1); data.extend_from_slice(&[0x22; 20]);
write_varint(&mut data, 2);
data.extend_from_slice(b"_x");
data.extend_from_slice(&0u16.to_le_bytes());
data.push(0); data.push(0x10); data.extend_from_slice(&0u16.to_le_bytes());
write_varint(&mut data, script.len() as u32);
data.extend_from_slice(&script);
let checksum = NefParser::calculate_checksum(&data);
data.extend_from_slice(&checksum.to_le_bytes());
let err = NefParser::new().parse(&data).unwrap_err();
assert!(matches!(
err,
crate::error::Error::Nef(NefError::MethodNameInvalid { .. })
));
}
#[test]
fn rejects_call_flags_with_unsupported_bits() {
let script = vec![0x40];
let mut data = Vec::new();
data.extend_from_slice(&MAGIC);
data.extend_from_slice(&[0u8; 64]);
data.push(0); data.push(0); data.push(1); data.extend_from_slice(&[0x33; 20]);
write_varint(&mut data, 3);
data.extend_from_slice(b"foo");
data.extend_from_slice(&0u16.to_le_bytes());
data.push(0); data.push(0x80); data.extend_from_slice(&0u16.to_le_bytes());
write_varint(&mut data, script.len() as u32);
data.extend_from_slice(&script);
let checksum = NefParser::calculate_checksum(&data);
data.extend_from_slice(&checksum.to_le_bytes());
let err = NefParser::new().parse(&data).unwrap_err();
assert!(matches!(
err,
crate::error::Error::Nef(NefError::CallFlagsInvalid { .. })
));
}
#[test]
fn rejects_too_many_method_tokens() {
let script = vec![0x40];
let mut data = Vec::new();
data.extend_from_slice(&MAGIC);
data.extend_from_slice(&[0u8; 64]);
data.push(0); data.push(0); write_varint(&mut data, (MAX_METHOD_TOKENS + 1) as u32);
data.extend_from_slice(&0u16.to_le_bytes());
write_varint(&mut data, script.len() as u32);
data.extend_from_slice(&script);
let checksum = NefParser::calculate_checksum(&data);
data.extend_from_slice(&checksum.to_le_bytes());
let err = NefParser::new().parse(&data).unwrap_err();
assert!(matches!(
err,
crate::error::Error::Nef(NefError::TooManyMethodTokens { .. })
));
}
#[test]
fn rejects_oversized_u64_varint_for_method_token_count() {
let script = vec![0x40];
let mut data = Vec::new();
data.extend_from_slice(&MAGIC);
data.extend_from_slice(&[0u8; 64]);
data.push(0); data.push(0); data.push(0xFF);
data.extend_from_slice(&(u32::MAX as u64 + 1).to_le_bytes());
data.extend_from_slice(&0u16.to_le_bytes());
write_varint(&mut data, script.len() as u32);
data.extend_from_slice(&script);
let checksum = NefParser::calculate_checksum(&data);
data.extend_from_slice(&checksum.to_le_bytes());
let err = NefParser::new().parse(&data).unwrap_err();
assert!(matches!(
err,
crate::error::Error::Nef(NefError::IntegerOverflow { offset: 70 })
));
}
#[test]
fn rejects_non_canonical_varint_for_method_token_count() {
let script = vec![0x40];
let mut data = Vec::new();
data.extend_from_slice(&MAGIC);
data.extend_from_slice(&[0u8; 64]);
data.push(0); data.push(0); data.push(0xFD);
data.extend_from_slice(&0u16.to_le_bytes());
data.extend_from_slice(&0u16.to_le_bytes());
write_varint(&mut data, script.len() as u32);
data.extend_from_slice(&script);
let checksum = NefParser::calculate_checksum(&data);
data.extend_from_slice(&checksum.to_le_bytes());
let err = NefParser::new().parse(&data).unwrap_err();
assert!(matches!(
err,
crate::error::Error::Nef(NefError::NonCanonicalVarInt { offset: 70 })
));
}