From 9e656d7dc03ef619ae51a18cc8ecf154b9e525b9 Mon Sep 17 00:00:00 2001 From: Jannik Peters Date: Wed, 27 Nov 2024 14:25:09 +0100 Subject: [PATCH] Implement ldns compatible ZONEMD option parsing --- src/commands/signzone.rs | 41 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/commands/signzone.rs b/src/commands/signzone.rs index 68b5344..35f6684 100644 --- a/src/commands/signzone.rs +++ b/src/commands/signzone.rs @@ -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 { + let scheme; + let hash_alg; + + fn parse_zonemd_scheme_ldns(s: &str) -> Result { + 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 { + 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 { // We can't just use Timestamp::from_str from the domain crate because // ldns-signzone treats YYYYMMDD as a special case and domain does