Implement ldns compatible ZONEMD option parsing

This commit is contained in:
Jannik Peters
2024-11-27 14:30:34 +01:00
parent 9a0c7b12b1
commit 9e656d7dc0
+39 -2
View File
@@ -302,8 +302,11 @@ impl LdnsCommand for SignZone {
}
Arg::Short('z') => {
let val = parser.value()?;
// FIXME: make parsing take lower case like the original
zonemd.push(parse_os_with("-z", &val, SignZone::parse_zonemd_tuple)?);
zonemd.push(parse_os_with(
"-z",
&val,
SignZone::parse_zonemd_tuple_ldns,
)?);
}
Arg::Short('Z') => {
allow_zonemd_without_signing = true;
@@ -410,6 +413,40 @@ impl SignZone {
Ok(ZonemdTuple(scheme, hash_alg))
}
fn parse_zonemd_tuple_ldns(arg: &str) -> Result<ZonemdTuple, Error> {
let scheme;
let hash_alg;
fn parse_zonemd_scheme_ldns(s: &str) -> Result<ZonemdScheme, Error> {
match s {
"simple" | "1" => Ok(ZonemdScheme::Simple),
_ => {
return Err(format!("unknown ZONEMD scheme name or number").into());
}
}
}
fn parse_zonemd_hash_alg_ldns(h: &str) -> Result<ZonemdAlgorithm, Error> {
match h {
"sha384" | "1" => Ok(ZonemdAlgorithm::Sha384),
"sha512" | "2" => Ok(ZonemdAlgorithm::Sha512),
_ => {
return Err(format!("unknown ZONEMD algorithm name or number").into());
}
}
}
if let Some((s, h)) = arg.split_once(':') {
scheme = parse_zonemd_scheme_ldns(s)?;
hash_alg = parse_zonemd_hash_alg_ldns(h)?;
} else {
scheme = ZonemdScheme::Simple;
hash_alg = parse_zonemd_hash_alg_ldns(arg)?;
};
Ok(ZonemdTuple(scheme, hash_alg))
}
pub fn parse_timestamp(arg: &str) -> Result<Timestamp, Error> {
// We can't just use Timestamp::from_str from the domain crate because
// ldns-signzone treats YYYYMMDD as a special case and domain does