diff --git a/keygen.go b/keygen.go index 58c6447f..cba224dd 100644 --- a/keygen.go +++ b/keygen.go @@ -111,23 +111,6 @@ func (r *RR_DNSKEY) PrivateKeyString(p PrivateKey) (s string) { return } -// Read reads a DNSKEY from the io.Reader q. -func (k *RR_DNSKEY) Read(q io.Reader) error { - r, err := newRRReader(q) - if err != nil { - return err - } - if _, ok := r.(*RR_DNSKEY); !ok { - return ErrKey - } - k.Hdr = r.(*RR_DNSKEY).Hdr - k.Flags = r.(*RR_DNSKEY).Flags - k.Protocol = r.(*RR_DNSKEY).Protocol - k.Algorithm = r.(*RR_DNSKEY).Algorithm - k.PublicKey = r.(*RR_DNSKEY).PublicKey - return nil -} - // ReadPrivateKey reads a private key from the io.Reader q. func (k *RR_DNSKEY) ReadPrivateKey(q io.Reader) (PrivateKey, error) { /* diff --git a/parse_test.go b/parse_test.go index 7bf1abec..40633ae5 100644 --- a/parse_test.go +++ b/parse_test.go @@ -1,12 +1,11 @@ package dns import ( - // "os" - // "time" - // "bufio" "crypto/rsa" + "os" "strings" "testing" + "time" ) func TestSign(t *testing.T) { @@ -26,8 +25,8 @@ Created: 20110302104537 Publish: 20110302104537 Activate: 20110302104537` - k := new(RR_DNSKEY) - k.Read(strings.NewReader(pub)) + xk, _ := NewRR(pub) // TODO err + k := xk.(*RR_DNSKEY) p, err := k.ReadPrivateKey(strings.NewReader(priv)) if err != nil { t.Logf("%v\n", err) @@ -95,9 +94,8 @@ func TestDotInName(t *testing.T) { t.Fail() } } -/* + // Make this a decend test case. For now, good enough -// New style (Ragel) parsing func TestParse(t *testing.T) { tests := map[string]string{ "miek.nl. 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1", @@ -106,74 +104,68 @@ func TestParse(t *testing.T) { "miek.nl. A 127.0.0.1": "miek.nl.\t0\tCLASS0\tA\t127.0.0.1", "miek.nl. IN AAAA ::1": "miek.nl.\t0\tIN\tAAAA\t::1", "miek.nl. IN A 127.0.0.1": "miek.nl.\t0\tIN\tA\t127.0.0.1", - "miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ": "miek.nl.\t0\tIN\tDNSKEY\t256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ", - "nlnetlabs.nl. 3175 IN DNSKEY 256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh": "nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh", - "dnsex.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400": "dnsex.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400", - "dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=": "dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=", + "miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ": "miek.nl.\t0\tIN\tDNSKEY\t256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ", + "nlnetlabs.nl. 3175 IN DNSKEY 256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh": "nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh", + "dnsex.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400": "dnsex.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400", + "dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=": "dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=", } - p := NewParser(strings.NewReader(tests)) - p.Run() - for r := range p.RR { - if r == nil { - t.Log("Empty RR") - t.Fail() - } else { - if r.(RR).String() != result { - t.Logf("\"%s\" should be equal to\n\"%s\"\n", r, result) - t.Fail() - } - } + for i, o := range tests { + rr, _ := NewRR(i) + if rr.String() != o { + t.Logf("\"%s\" should be equal to\n\"%s\"\n", i, o) + t.Fail() + } + t.Logf("%s\n", rr.String()) } } func TestParseFailure(t *testing.T) { - tests := []string{"miek.nl. IN A 327.0.0.1", - "miek.nl. IN AAAA ::x", - "miek.nl. IN MX a0 miek.nl.", - } -// Tests that make me crash -// "miek.nl aap IN MX mx.miek.nl.", -// "miek.nl. IN CNAME ", -// "miek.nl. PA MX 10 miek.nl.", + tests := []string{"miek.nl. IN A 327.0.0.1", + "miek.nl. IN AAAA ::x", + "miek.nl. IN MX a0 miek.nl.", + "miek.nl aap IN MX mx.miek.nl.", + "miek.nl. IN CNAME ", + "miek.nl. PA MX 10 miek.nl.", + } - for _, t1 := range tests { - _, err := NewRRString(t1) - if err == nil { - t.Log("Should have triggered an error") - t.Fail() - } else { - t.Logf("%s: %s\n", t1, err.String()) - } - } + for _, s := range tests { + rr, err := NewRR(s) + if err == nil { + t.Log("Should have triggered an error") + t.Fail() + } else { + t.Logf("%s: %s\n", rr, err.Error()) + } + } } func BenchmarkZoneParsing(b *testing.B) { - file, err := os.Open("miek.nl.signed_test") - defer file.Close() + f, err := os.Open("miek.nl.signed_test") if err != nil { return } - p := NewParser(bufio.NewReader(file)) - p.Zone() + defer f.Close() + cr := make(chan RR) + ParseZone(f, cr) + select { + case <-cr: + } } func TestZoneParsing(t *testing.T) { - file, err := os.Open("miek.nl.signed_test") - defer file.Close() + f, err := os.Open("miek.nl.signed_test") if err != nil { return } - p := NewParser(bufio.NewReader(file)) - start := time.Nanoseconds() - z, err := p.Zone() - if err != nil { - t.Logf("error %v\n", err.String()) - t.Fail() + defer f.Close() + cr := make(chan RR) + start := time.Now().Nanosecond() + ParseZone(f, cr) + var i int + select { + case <-cr: + i++ } - delta := time.Nanoseconds() - start - if z != nil { - t.Logf("%s", z.Nxt) - t.Logf("%d RRs parsed in %.2f s (%.2f RR/s)", z.Len(), float32(delta)/1e9, float32(z.Len())/(float32(delta)/1e9)) - } + delta := time.Now().Nanosecond() - start + t.Logf("%d RRs parsed in %.2f s (%.2f RR/s)", i, float32(delta)/1e9, float32(i)/(float32(delta)/1e9)) } -*/ diff --git a/types.go b/types.go index 13e9a2a3..d9bb546d 100644 --- a/types.go +++ b/types.go @@ -146,14 +146,6 @@ func (q *Question) String() string { return s } -// NewRR returns a new RR with the hdr.Rrtype also set. -// If the type i is not known, nil is returned. -func NewRR(i uint16) RR { - r := rr_mk[i]() - r.Header().Rrtype = i - return r -} - type RR_ANY struct { Hdr RR_Header // Does not have any rdata diff --git a/zscan.go b/zscan.go index 5a8d5421..71f0a4b6 100644 --- a/zscan.go +++ b/zscan.go @@ -61,22 +61,16 @@ type Lex struct { column int // column in the fil } -// ParseString parses a string and returns the RR contained in there. If the string -// contains more than one RR, only the first is returned. -func NewRRString(s string) (RR, error) { +// NewRR parses the string s and returns the RR contained in there. If the string +// contains more than one RR, only the first is returned. If an error is detected +// an error is returned. [TODO] +func NewRR(s string) (RR, error) { cr := make(chan RR) go ParseZone(strings.NewReader(s), cr) r := <-cr // There are no error send as of yet return r, nil // Todo: errors } -func newRRReader(q io.Reader) (RR, error) { - cr := make(chan RR) - go ParseZone(q, cr) - r := <-cr - return r, nil -} - // ParseZone reads a RFC 1035 zone from r. It returns each parsed RR on the // channel cr. The channel cr is closed by ParseZone when the end of r is reached. func ParseZone(r io.Reader, cr chan RR) {