From ef732d1050a3a30a16cccd39edc21cd26ddada62 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sat, 11 Jan 2014 08:50:10 +0000 Subject: [PATCH] RRSIGs: parse epoch timestamp too According to RFC4034 the timestamp in RRSIG may also be an EPOCH. Check for this when parsing. Knot DNS zone dumps contain timestamp RRSIG, this makes those parseable by Go DNS. --- parse_test.go | 7 +++---- zscan_rr.go | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/parse_test.go b/parse_test.go index 4aa38aea..ef6b3517 100644 --- a/parse_test.go +++ b/parse_test.go @@ -179,7 +179,7 @@ func TestQuotes(t *testing.T) { `t.example.com. IN TXT "a bc"`: "t.example.com.\t3600\tIN\tTXT\t\"a bc\"", `t.example.com. IN TXT "a bc"`: "t.example.com.\t3600\tIN\tTXT\t\"a\\n bc\"", - `t.example.com. IN TXT ""`: "t.example.com.\t3600\tIN\tTXT\t\"\"", + `t.example.com. IN TXT ""`: "t.example.com.\t3600\tIN\tTXT\t\"\"", `t.example.com. IN TXT "a"`: "t.example.com.\t3600\tIN\tTXT\t\"a\"", `t.example.com. IN TXT "aa"`: "t.example.com.\t3600\tIN\tTXT\t\"aa\"", `t.example.com. IN TXT "aaa" ;`: "t.example.com.\t3600\tIN\tTXT\t\"aaa\"", @@ -817,7 +817,7 @@ func TestDigit(t *testing.T) { func TestParseRRSIGTimestamp(t *testing.T) { tests := map[string]bool{ `miek.nl. IN RRSIG SOA 8 2 43200 20140210031301 20140111031301 12051 miek.nl. MVZUyrYwq0iZhMFDDnVXD2BvuNiUJjSYlJAgzyAE6CF875BMvvZa+Sb0 RlSCL7WODQSQHhCx/fegHhVVF+Iz8N8kOLrmXD1+jO3Bm6Prl5UhcsPx WTBsg/kmxbp8sR1kvH4oZJtVfakG3iDerrxNaf0sQwhZzyfJQAqpC7pcBoc=`: true, -// `miek.nl. IN RRSIG SOA 8 2 43200 315565800 4102477800 12051 miek.nl. MVZUyrYwq0iZhMFDDnVXD2BvuNiUJjSYlJAgzyAE6CF875BMvvZa+Sb0 RlSCL7WODQSQHhCx/fegHhVVF+Iz8N8kOLrmXD1+jO3Bm6Prl5UhcsPx WTBsg/kmxbp8sR1kvH4oZJtVfakG3iDerrxNaf0sQwhZzyfJQAqpC7pcBoc=`:true, + `miek.nl. IN RRSIG SOA 8 2 43200 315565800 4102477800 12051 miek.nl. MVZUyrYwq0iZhMFDDnVXD2BvuNiUJjSYlJAgzyAE6CF875BMvvZa+Sb0 RlSCL7WODQSQHhCx/fegHhVVF+Iz8N8kOLrmXD1+jO3Bm6Prl5UhcsPx WTBsg/kmxbp8sR1kvH4oZJtVfakG3iDerrxNaf0sQwhZzyfJQAqpC7pcBoc=`: true, } for r, _ := range tests { _, e := NewRR(r) @@ -826,5 +826,4 @@ func TestParseRRSIGTimestamp(t *testing.T) { t.Logf("%s\n", e.Error()) } } -} - +} diff --git a/zscan_rr.go b/zscan_rr.go index 45276ebd..338ae584 100644 --- a/zscan_rr.go +++ b/zscan_rr.go @@ -1168,14 +1168,24 @@ func setRRSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { <-c // _BLANK l = <-c if i, err := StringToTime(l.token); err != nil { - return nil, &ParseError{f, "bad RRSIG Expiration", l}, "" + // Try to see if all numeric and use it as epoch + if i, err := strconv.ParseInt(l.token, 10, 64); err == nil { + // TODO(miek): error out on > MAX_UINT32, same below + rr.Expiration = uint32(i) + } else { + return nil, &ParseError{f, "bad RRSIG Expiration", l}, "" + } } else { rr.Expiration = i } <-c // _BLANK l = <-c if i, err := StringToTime(l.token); err != nil { - return nil, &ParseError{f, "bad RRSIG Inception", l}, "" + if i, err := strconv.ParseInt(l.token, 10, 64); err == nil { + rr.Inception = uint32(i) + } else { + return nil, &ParseError{f, "bad RRSIG Inception", l}, "" + } } else { rr.Inception = i }