///|
/// Fuzz differential partner of tools/differential.py --fuzz: reads two
/// integers (seed and line count) from the moon run argument tail and
/// prints one findings line per generated input, using the identical
/// Lehmer generator and template table.
fn lcg2(state : Int64) -> Int64 {
state * 48271L % 2147483647L
}
///|
fn word2(state : Int64, length : Int) -> (String, Int64) {
let letters = "abcdefghijklmnopqrstuvwxyz"
let buf = StringBuilder()
let mut s = state
for _ in 0.. ")
return
}
let seed = try @string.parse_int(args[args.length() - 2], base=10) catch {
_ => -1
} noraise {
v => v
}
let count = try @string.parse_int(args[args.length() - 1], base=10) catch {
_ => -1
} noraise {
v => v
}
if seed < 0 || count < 0 {
println("usage: findings-fuzz ")
return
}
let seed_val = seed
let count_val = count
let config = @scrub.ScanConfig::standard()
let mut state = seed_val.to_int64()
for i = 0; i < count_val; i = i + 1 {
state = lcg2(state)
if state % 4L == 0L {
let (w, next) = word2(state, 10)
state = next
println("-")
ignore(w)
continue
}
let slot = state % 7L
let mut line = ""
if slot == 0L {
let (w, next) = word2(state, 7)
state = next
line = "ghp_" + w + "abcdefghij"
} else if slot == 1L {
let (w, next) = word2(state, 7)
state = next
line = "password=" + w
} else if slot == 2L {
let (w, next) = word2(state, 7)
state = next
line = "mail " + w + "@example.com"
} else if slot == 3L {
let (a, s1) = word2(state, 7)
let (b, s2) = word2(s1, 7)
state = s2
line = "ip 10.0." + a + "." + b
} else if slot == 4L {
let (w, next) = word2(state, 7)
state = next
line = "token=xoxb-" + w + "-1234567890"
} else if slot == 5L {
let (a, s1) = word2(state, 7)
let (b, s2) = word2(s1, 7)
state = s2
line = "bearer " + a + b
} else {
let (w, next) = word2(state, 7)
state = next
line = "id 1101051990010100" + w
}
let findings = @scrub.scan_with_config(line, config)
if findings.length() == 0 {
println("-")
} else {
let mut parts = ""
for f in findings {
parts += f.kind.to_string() +
" " +
f.start.to_string() +
" " +
f.end.to_string() +
" " +
f.confidence.to_string() +
";"
}
println(parts)
}
}
}