Include the resolver-provided TTL in the response
[dnssec-prover] / src / query.rs
index 675d82b0badc6d708af4ac653e4366d3626a53ed..8ce551955cf0f03497c2918f221c99b50611b383 100644 (file)
@@ -10,7 +10,7 @@ use tokio_crate::net::TcpStream as TokioTcpStream;
 use tokio_crate::io::{AsyncReadExt, AsyncWriteExt};
 
 
-use crate::write_rr;
+use crate::validation::write_rr;
 use crate::rr::*;
 use crate::ser::*;
 
@@ -83,8 +83,8 @@ fn handle_response(resp: &[u8], proof: &mut Vec<u8>) -> Result<Option<RRSig>, Er
        // Only read the answers (skip authorities and additional) as that's all we care about.
        let mut rrsig_opt = None;
        for _ in 0..answers {
-               let rr = emap(parse_wire_packet_rr(&mut read, &resp))?;
-               write_rr(&rr, 0, proof);
+               let (rr, ttl) = emap(parse_wire_packet_rr(&mut read, &resp))?;
+               write_rr(&rr, ttl, proof);
                if let RR::RRSig(rrsig) = rr { rrsig_opt = Some(rrsig); }
        }
        Ok(rrsig_opt)
@@ -206,11 +206,12 @@ pub async fn build_tlsa_proof_async(resolver: SocketAddr, domain: Name) -> Resul
 #[cfg(test)]
 mod tests {
        use super::*;
-       use crate::*;
+       use crate::validation::*;
 
        use rand::seq::SliceRandom;
 
        use std::net::ToSocketAddrs;
+       use std::time::SystemTime;
 
        #[test]
        fn test_txt_query() {
@@ -221,7 +222,11 @@ mod tests {
                let mut rrs = parse_rr_stream(&proof).unwrap();
                rrs.shuffle(&mut rand::rngs::OsRng);
                let verified_rrs = verify_rr_stream(&rrs).unwrap();
-               assert_eq!(verified_rrs.len(), 1);
+               assert_eq!(verified_rrs.verified_rrs.len(), 1);
+
+               let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
+               assert!(verified_rrs.valid_from < now);
+               assert!(verified_rrs.expires > now);
        }
 
        #[cfg(feature = "tokio")]
@@ -237,6 +242,10 @@ mod tests {
                let mut rrs = parse_rr_stream(&proof).unwrap();
                rrs.shuffle(&mut rand::rngs::OsRng);
                let verified_rrs = verify_rr_stream(&rrs).unwrap();
-               assert_eq!(verified_rrs.len(), 1);
+               assert_eq!(verified_rrs.verified_rrs.len(), 1);
+
+               let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
+               assert!(verified_rrs.valid_from < now);
+               assert!(verified_rrs.expires > now);
        }
 }