Parsings works - clean up the tests

RR_DNSKEY has now a
* Read (to read an RR)
* ReadPrivateKey (to read an private key file)

Together you have enough data to sign and verify DNSSEC data.
I'm thinking about a better API, but I think one will emerge
whenever I complete the zone parsin.
This commit is contained in:
Miek Gieben 2011-07-17 20:51:27 +02:00
parent 8c595abe56
commit fd0064c805
6 changed files with 197 additions and 236 deletions

View File

@ -340,7 +340,7 @@ func (s *RR_RRSIG) Verify(k *RR_DNSKEY, rrset RRset) bool {
case ECC:
case ECCGOST:
default:
// Unknown Alg
// Unknown alg
return false
}
return err == nil

View File

@ -1,7 +1,6 @@
package dns
import (
"fmt"
"testing"
"strings"
)
@ -109,7 +108,6 @@ func TestSignVerify(t *testing.T) {
sig.SignerName = key.Hdr.Name
sig.Algorithm = RSASHA256
// zal wel goed zijn
if !sig.Sign(privkey, []RR{soa}) {
t.Log("Failure to sign the SOA record")
t.Fail()
@ -120,30 +118,25 @@ func TestSignVerify(t *testing.T) {
}
}
func TestKeyGenRSA(t *testing.T) {
key := new(RR_DNSKEY)
key.Hdr.Name = "miek.nl."
key.Hdr.Rrtype = TypeDNSKEY
key.Hdr.Class = ClassINET
key.Hdr.Ttl = 3600
key.Flags = 256
key.Protocol = 3
key.Algorithm = RSASHA256
key.Generate(1024)
fmt.Printf("%v\n", key)
}
func TestKeyGen(t *testing.T) {
algs := []uint8{RSASHA256, ECDSAP256SHA256}
bits := []int{1024, 256}
func TestKeyGenCurve(t *testing.T) {
i := 0
key := new(RR_DNSKEY)
key.Hdr.Name = "miek.nl."
key.Hdr.Name = "keygen.miek.nl."
key.Hdr.Rrtype = TypeDNSKEY
key.Hdr.Class = ClassINET
key.Hdr.Ttl = 3600
key.Flags = 256
key.Protocol = 3
key.Algorithm = ECDSAP256SHA256
key.Generate(0)
fmt.Printf("%v\n", key)
for _, v := range algs {
key.Algorithm = v
key.Generate(bits[i])
i++
t.Logf("%s\n", key)
}
//Really hard to figure out what to check here... Parse it back to a proper key?
}
/*
@ -207,8 +200,7 @@ func TestTag(t *testing.T) {
tag := key.KeyTag()
if tag != 12051 {
t.Logf("%v\n", key)
t.Logf("Wrong key tag: %d\n", tag)
t.Logf("Wrong key tag: %d for key %v\n", tag, key)
t.Fail()
}
}

View File

@ -112,6 +112,23 @@ func (r *RR_DNSKEY) PrivateKeyString(p PrivateKey) (s string) {
return
}
func (k *RR_DNSKEY) Read(q io.Reader) os.Error {
r, e := Zparse(q)
if e != nil || r == nil {
return e
}
if _, ok := r.(*RR_DNSKEY); !ok {
panic("did not read a DNSKEY")
}
k1 := r.(*RR_DNSKEY)
k.Hdr = k1.Hdr
k.Flags = k1.Flags
k.Protocol = k1.Protocol
k.Algorithm = k1.Algorithm
k.PublicKey = k1.PublicKey
return nil
}
func (k *RR_DNSKEY) ReadPrivateKey(q io.Reader) (PrivateKey, os.Error) {
kv, _ := Kparse(q)
if _, ok := kv["private-key-format"]; !ok {
@ -120,14 +137,13 @@ func (k *RR_DNSKEY) ReadPrivateKey(q io.Reader) (PrivateKey, os.Error) {
if kv["private-key-format"] != "v1.2" && kv["private-key-format"] != "v1.3" {
return nil, ErrPrivKey
}
switch kv["algorithm"] {
switch kv["algorithm"] {
case "RSAMD5", "RSASHA1", "RSASHA256", "RSASHA512":
return k.readPrivateKeyRSA(kv)
case "ECDSAP256SHA256", "ECDSAP384SHA384":
return k.readPrivateKeyECDSA(kv)
}
println("SOMETHING WRONG\n\n")
return nil, ErrKey
return nil, ErrPrivKey
}
// Read a private key (file) string and create a public key. Return the private key.
@ -145,12 +161,10 @@ func (k *RR_DNSKEY) readPrivateKeyRSA(kv map[string]string) (PrivateKey, os.Erro
case "modulus":
p.PublicKey.N = big.NewInt(0)
p.PublicKey.N.SetBytes(v1)
println("modulus",v)
case "publicexponent":
i := big.NewInt(0)
i.SetBytes(v1)
p.PublicKey.E = int(i.Int64()) // int64 should be large enough
println("publicexponent",v)
case "privateexponent":
p.D = big.NewInt(0)
p.D.SetBytes(v1)
@ -165,20 +179,15 @@ func (k *RR_DNSKEY) readPrivateKeyRSA(kv map[string]string) (PrivateKey, os.Erro
// not used in Go (yet)
case "created", "publish", "activate":
// not used in Go (yet)
default:
return nil, ErrKey
}
}
if ! k.setPublicKeyRSA(p.PublicKey.E, p.PublicKey.N) {
println("Failure to set")
return nil, ErrKey
}
return p, nil
}
func (k *RR_DNSKEY) readPrivateKeyECDSA(kv map[string]string) (PrivateKey, os.Error) {
p := new(ecdsa.PrivateKey)
p.D = big.NewInt(0)
// Need to check if we have everything
for k, v := range kv {
switch k {
case "privatekey:":
@ -189,12 +198,7 @@ func (k *RR_DNSKEY) readPrivateKeyECDSA(kv map[string]string) (PrivateKey, os.Er
p.D.SetBytes(v1)
case "created:", "publish:", "activate:":
/* not used in Go (yet) */
default:
return nil, ErrKey
}
}
//if ! k.setPublicKeyRSA(p.PublicKey.E, p.PublicKey.N) {
// return nil, ErrKey
//}
return p, nil
}

View File

@ -1,77 +1,51 @@
package dns
import (
"fmt"
"net"
"strings"
"testing"
"crypto/rsa"
)
func TestPrivateKeyRead1(t *testing.T) {
a := `Private-key-format: v1.3
func TestSign(t *testing.T) {
pub := "miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ"
priv := `Private-key-format: v1.3
Algorithm: 5 (RSASHA1)
Modulus: vyVjCzz87g3rg9vDj1NJ1tlFP7lEY2pEQLkWGXAFuZM6Fw/bNmEH/z3ybDfsJqx4QQ6YZXN8V2kbzY7oX+tExf6AMiMIcKYzEGwg5xBYFh33du4G+6kE/VzG906ubpaIEnrZOMTdGqE7OwptAqrqXe4uGXY99ZqNdqutOKQyIzs=
Modulus: v7yUY0LEmAtLythV6voScdW4iRAOCF2N217APNTcblHs9sxspVG8fYxrulDJhx6hqpZlCKtKPvZ649Z8/FCczL25wLKUD4W4f1xKMhw9/g+ol926keT1foQFiPGsItjinX/IHCDIEhEm1m0Cozdx4AfZai8QkPqtO064ejkCW4k=
PublicExponent: AQAB
PrivateExponent: PFg/RoMAjt8SJVSyDoOK4itBs3Z34rLfzVchZPJ6vDWAt1soJ6jGb4xNBmE5SpRUeqVy80RcUvQ59NFTB0UtNo/zAXhC1RfKiFCNRFTyV3k6a9CMLPAU9g4peW91lw87HXnYALTC9bTiTAoMU3vKvNx80F5qfK7qY/N28S1PMeE=
Prime1: +vPWyp37iUa7/LbhejOX/KdkhfwECUCdJF0uEePjaBCSf85xceEBzU89JFk9dCojtVqcI8xLKnRKRixg07Rc+Q==
Prime2: wv2aVWr13Cq2vRkKiHlqqP9vihGuDN/kWfmXb7slJH3s2i9+yI7vepAlow9SY8lNHOqXibEaAFsP3aj5OAAS0w==
Exponent1: sChCenBzhWV1yGvH0zQsWFpYogTKAISuyjvufvhtRTt82uJbmAjObwRUcxOBo+2Aq2kzeZ2Klf6TtLaqMXHGYQ==
Exponent2: hXiKeAWrHXWveGj3qMtTkzKl6uCHPxDSgjQy0KxNlFkOE5uHMUmF62NYH/GQ9/UG79A0wm+T2MJ8bcIINaj3OQ==
Coefficient: xzZBvs2/IT7+iRQdn9I4slRTg9ryIecx7oKEKYTOEeyL2qq7rfY/FwZGy3EqyA/3lrkfFLx76qOeqAmCTUaU4w==
Created: 20101221142359
Publish: 20101221142359
Activate: 20101221142359`
PrivateExponent: YPwEmwjk5HuiROKU4xzHQ6l1hG8Iiha4cKRG3P5W2b66/EN/GUh07ZSf0UiYB67o257jUDVEgwCuPJz776zfApcCB4oGV+YDyEu7Hp/rL8KcSN0la0k2r9scKwxTp4BTJT23zyBFXsV/1wRDK1A5NxsHPDMYi2SoK63Enm/1ptk=
Prime1: /wjOG+fD0ybNoSRn7nQ79udGeR1b0YhUA5mNjDx/x2fxtIXzygYk0Rhx9QFfDy6LOBvz92gbNQlzCLz3DJt5hw==
Prime2: wHZsJ8OGhkp5p3mrJFZXMDc2mbYusDVTA+t+iRPdS797Tj0pjvU2HN4vTnTj8KBQp6hmnY7dLp9Y1qserySGbw==
Exponent1: N0A7FsSRIg+IAN8YPQqlawoTtG1t1OkJ+nWrurPootScApX6iMvn8fyvw3p2k51rv84efnzpWAYiC8SUaQDNxQ==
Exponent2: SvuYRaGyvo0zemE3oS+WRm2scxR8eiA8WJGeOc+obwOKCcBgeZblXzfdHGcEC1KaOcetOwNW/vwMA46lpLzJNw==
Coefficient: 8+7ZN/JgByqv0NfULiFKTjtyegUcijRuyij7yNxYbCBneDvZGxJwKNi4YYXWx743pcAj4Oi4Oh86gcmxLs+hGw==
Created: 20110302104537
Publish: 20110302104537
Activate: 20110302104537`
k := new(RR_DNSKEY)
p, _ := k.ReadPrivateKey(strings.NewReader(a))
p = p
}
func TestPrivateKeyRead2(t *testing.T) {
/* b:=`; This is a zone-signing key, keyid 41946, for miek.nl.
; Created: 20110109154937 (Sun Jan 9 16:49:37 2011)
; Publish: 20110109154937 (Sun Jan 9 16:49:37 2011)
; Activate: 20110109154937 (Sun Jan 9 16:49:37 2011)
miek.nl. IN DNSKEY 256 3 5 AwEAAeETsGZdYlTsHK8wc1yo9Zcj4dMEpPWRTYuTmGD3e4Qsk4/uyKf5jhsNZhp8no7GKHTEe7+K1prC4iXo3X5oQyDDmx76hDo5u6fblu/XaQw16wqMDQDPiURUKkzobJlmY6fYNKRz7A01J73V6qDMCvlk+8p+fb0a+LiJ2NJDACln`
*/
a := `Private-key-format: v1.3
Algorithm: 5 (RSASHA1)
Modulus: 4ROwZl1iVOwcrzBzXKj1lyPh0wSk9ZFNi5OYYPd7hCyTj+7Ip/mOGw1mGnyejsYodMR7v4rWmsLiJejdfmhDIMObHvqEOjm7p9uW79dpDDXrCowNAM+JRFQqTOhsmWZjp9g0pHPsDTUnvdXqoMwK+WT7yn59vRr4uInY0kMAKWc=
PublicExponent: AQAB
PrivateExponent: CYYAv8QRxhAbgpolN3V6tsNw6bHXnQBh7Jb5KpkuI8CTGdL7sIfRqHlfqZ0+REJEMfSiW89vFytJ0FrTDGcy99qesJujW/tlfsThRTwFSXdCNv0Df25CNNNeskMg3r86is8MmHJc+dAjN3P0ArAF2yZd9gS7C4TGKDDR3bZ9SYk=
Prime1: 8EO3P0cYdR8FISxLaUVfVJVIVAWux7tptnqZlzAmomPGEipXr2bAYf637hAAoD8xEUXbI6FIkXUk5vIjxfUjRQ==
Prime2: 79FWWF5PNh6ykof9NsrR2YRy/P30iLbzfSRVQrrYH15SEip5LUN15W/G7bg5Uyp8U/o3HXaaxhrj9LC330Uuuw==
Exponent1: mtOIKoauBAtRSuc4UUYbAG6ShVKEJsFmhejLQNoOi2awJNSUXLtiDcQO0qINRTZzcCYL6RHtqY5LkWdIFjC54Q==
Exponent2: ZpsiXly7d2Ra8ubMKA1PC8nniOb/IR9lvj01XX+jyIgKhUs23W7nmmrgqgUQQc0DtMpxmmGMhwYqUh7qDNUE0Q==
Coefficient: 2wn6uW28qM6B68m1ADcLmzjwIQn9Xyc/JMydrJUSzwG7Fr08bc1aa1+K/K0pVy82vU5emDKdVXPP4+WtqXnUNA==
Created: 20110109154937
Publish: 20110109154937
Activate: 20110109154937`
k := new(RR_DNSKEY)
k.Hdr.Rrtype = TypeDNSKEY
k.Hdr.Class = ClassINET
k.Hdr.Name = "miek.nl."
k.Hdr.Ttl = 3600
k.Protocol = 3
k.Flags = 256
k.Algorithm = RSASHA1
p, _ := k.ReadPrivateKey(strings.NewReader(a))
k.Read(strings.NewReader(pub))
p, err := k.ReadPrivateKey(strings.NewReader(priv))
if err != nil {
t.Logf("%v\n", err)
t.Fail()
}
switch priv := p.(type) {
case *rsa.PrivateKey:
if 65537 != priv.PublicKey.E {
t.Log("Exponenent should be 65537")
t.Fail()
}
default:
t.Logf("We should have read an RSA key: %v", priv)
t.Fail()
}
if k.KeyTag() != 41946 {
if k.KeyTag() != 37350 {
t.Logf("%d %v\n", k.KeyTag(), k)
t.Log("Keytag should be 41946")
t.Log("Keytag should be 37350")
t.Fail()
}
println(k.String())
soa := new(RR_SOA)
soa.Hdr = RR_Header{"miek.nl.", TypeSOA, ClassINET, 14400, 0}
@ -92,7 +66,11 @@ Activate: 20110109154937`
sig.Algorithm = k.Algorithm
sig.Sign(p, []RR{soa})
fmt.Printf("%v\n%v\n%v\n", k, soa, sig)
if sig.Signature != "D5zsobpQcmMmYsUMLxCVEtgAdCvTu8V/IEeP4EyLBjqPJmjt96bwM9kqihsccofA5LIJ7DN91qkCORjWSTwNhzCv7bMyr2o5vBZElrlpnRzlvsFIoAZCD9xg6ZY7ZyzUJmU6IcTwG4v3xEYajcpbJJiyaw/RqR90MuRdKPiBzSo=" {
t.Log("Signature is not correct")
t.Logf("%v\n", sig)
t.Fail()
}
}
func TestA(t *testing.T) {
@ -141,37 +119,22 @@ func TestDotInName(t *testing.T) {
// Make this a decend test case. For now, good enough
// New style (Ragel) parsing
func TestParse(t *testing.T) {
rr, _ := Zparse(strings.NewReader("miek.nl. 3600 IN A 127.0.0.1"))
fmt.Printf("Seen a:\n%v\n", rr)
rr, _ = Zparse(strings.NewReader("miek.nl. 3600 IN MX 10 elektron.atoom.net."))
fmt.Printf("Seen a:\n%v\n", rr)
rr, _ = Zparse(strings.NewReader("nlnetlabs.nl. 3175 IN DNSKEY 256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh"))
fmt.Printf("Seen a:\n%v\n", rr)
rr, _ = Zparse(strings.NewReader("miek.nl. IN A 127.0.0.1"))
fmt.Printf("Seen a:\n%v\n", rr)
rr, _ = Zparse(strings.NewReader("miek.nl. IN 3600 A 127.0.0.1"))
fmt.Printf("Seen a:\n%v\n", rr)
rr, _ = Zparse(strings.NewReader("miek.nl. A 127.0.0.1"))
fmt.Printf("Seen a:\n%v\n", rr)
}
func TestParseK(t *testing.T) {
a := `Private-key-format: v1.3
Algorithm: 5 (RSASHA1)
Modulus: v7yUY0LEmAtLythV6voScdW4iRAOCF2N217APNTcblHs9sxspVG8fYxrulDJhx6hqpZlCKtKPvZ649Z8/FCczL25wLKUD4W4f1xKMhw9/g+ol926keT1foQFiPGsItjinX/IHCDIEhEm1m0Cozdx4AfZai8QkPqtO064ejkCW4k=
PublicExponent: AQAB
PrivateExponent: YPwEmwjk5HuiROKU4xzHQ6l1hG8Iiha4cKRG3P5W2b66/EN/GUh07ZSf0UiYB67o257jUDVEgwCuPJz776zfApcCB4oGV+YDyEu7Hp/rL8KcSN0la0k2r9scKwxTp4BTJT23zyBFXsV/1wRDK1A5NxsHPDMYi2SoK63Enm/1ptk=
Prime1: /wjOG+fD0ybNoSRn7nQ79udGeR1b0YhUA5mNjDx/x2fxtIXzygYk0Rhx9QFfDy6LOBvz92gbNQlzCLz3DJt5hw==
Prime2: wHZsJ8OGhkp5p3mrJFZXMDc2mbYusDVTA+t+iRPdS797Tj0pjvU2HN4vTnTj8KBQp6hmnY7dLp9Y1qserySGbw==
Exponent1: N0A7FsSRIg+IAN8YPQqlawoTtG1t1OkJ+nWrurPootScApX6iMvn8fyvw3p2k51rv84efnzpWAYiC8SUaQDNxQ==
Exponent2: SvuYRaGyvo0zemE3oS+WRm2scxR8eiA8WJGeOc+obwOKCcBgeZblXzfdHGcEC1KaOcetOwNW/vwMA46lpLzJNw==
Coefficient: 8+7ZN/JgByqv0NfULiFKTjtyegUcijRuyij7yNxYbCBneDvZGxJwKNi4YYXWx743pcAj4Oi4Oh86gcmxLs+hGw==
Created: 20110302104537
Publish: 20110302104537
Activate: 20110302104537
`
m, _ := Kparse(strings.NewReader(a))
for k, v := range m {
fmt.Printf("{%s}={%s}\n", k, v)
tests := map[string]string{
"miek.nl. 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. 3600 IN MX 10 elektron.atoom.net.": "miek.nl.\t3600\tIN\tMX\t10 elektron.atoom.net.",
"miek.nl. IN 3600 A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. A 127.0.0.1": "miek.nl.\t0\tCLASS0\tA\t127.0.0.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",
}
for test, result := range tests {
r, _ := Zparse(strings.NewReader(test))
if r.String() != result {
t.Logf("\"%s\" should be equal to\n\"%s\"\n", r, result)
t.Fail()
}
}
}

228
zparse.go
View File

@ -117,11 +117,11 @@ st0:
cs = 0;
goto _out;
tr158:
// line 84 "zparse.rl"
// line 85 "zparse.rl"
{ hdr.Name = data[mark:p] }
goto st2
tr170:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 4 "types.rl"
{
@ -130,7 +130,7 @@ tr170:
}
goto st2
tr172:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 12 "types.rl"
{
@ -139,7 +139,7 @@ tr172:
}
goto st2
tr174:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 38 "types.rl"
{
@ -151,7 +151,7 @@ tr174:
}
goto st2
tr176:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 31 "types.rl"
{
@ -163,7 +163,7 @@ tr176:
}
goto st2
tr178:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 26 "types.rl"
{
@ -173,7 +173,7 @@ tr178:
}
goto st2
tr180:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 8 "types.rl"
{
@ -182,7 +182,7 @@ tr180:
}
goto st2
tr182:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 45 "types.rl"
{
@ -199,7 +199,7 @@ tr182:
}
goto st2
tr184:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
// line 16 "types.rl"
{
@ -244,9 +244,9 @@ case 2:
if 48 <= data[p] && data[p] <= 57 { goto tr3 }
goto st0
tr3:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st3
st3:
@ -262,7 +262,7 @@ case 3:
if 48 <= data[p] && data[p] <= 57 { goto st3 }
goto st0
tr13:
// line 87 "zparse.rl"
// line 88 "zparse.rl"
{ ttl, _ := strconv.Atoi(data[mark:p]); hdr.Ttl = uint32(ttl) }
goto st4
st4:
@ -295,7 +295,7 @@ case 4:
}
goto st0
tr16:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st5
st5:
@ -312,7 +312,7 @@ case 5:
}
goto st0
tr25:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -345,7 +345,7 @@ case 6:
}
goto st0
tr28:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st102
st102:
@ -390,11 +390,11 @@ case 8:
}
goto st0
tr166:
// line 87 "zparse.rl"
// line 88 "zparse.rl"
{ ttl, _ := strconv.Atoi(data[mark:p]); hdr.Ttl = uint32(ttl) }
goto st9
tr30:
// line 85 "zparse.rl"
// line 86 "zparse.rl"
{ hdr.Class = Str_class[data[mark:p]] }
goto st9
st9:
@ -423,7 +423,7 @@ case 9:
}
goto st0
tr32:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st10
st10:
@ -438,7 +438,7 @@ case 10:
}
goto st0
tr33:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st11
st11:
@ -493,7 +493,7 @@ case 15:
}
goto st0
tr39:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -526,7 +526,7 @@ case 16:
}
goto st0
tr41:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st103
st103:
@ -551,13 +551,13 @@ case 103:
}
goto st0
tr6:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st17
tr18:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st17
st17:
@ -624,7 +624,7 @@ case 22:
}
goto st0
tr48:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -648,7 +648,7 @@ case 23:
if 48 <= data[p] && data[p] <= 57 { goto tr50 }
goto st0
tr50:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st24
st24:
@ -664,7 +664,7 @@ case 24:
if 48 <= data[p] && data[p] <= 57 { goto st24 }
goto st0
tr51:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st25
st25:
@ -680,7 +680,7 @@ case 25:
if 48 <= data[p] && data[p] <= 57 { goto tr54 }
goto st0
tr54:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st26
st26:
@ -696,7 +696,7 @@ case 26:
if 48 <= data[p] && data[p] <= 57 { goto st26 }
goto st0
tr55:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st27
st27:
@ -712,7 +712,7 @@ case 27:
if 48 <= data[p] && data[p] <= 57 { goto tr58 }
goto st0
tr58:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st28
st28:
@ -728,7 +728,7 @@ case 28:
if 48 <= data[p] && data[p] <= 57 { goto st28 }
goto st0
tr59:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st29
st29:
@ -753,7 +753,7 @@ case 29:
}
goto st0
tr62:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st104
st104:
@ -788,7 +788,7 @@ case 30:
}
goto st0
tr63:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -812,7 +812,7 @@ case 31:
if 48 <= data[p] && data[p] <= 57 { goto tr65 }
goto st0
tr65:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st32
st32:
@ -828,7 +828,7 @@ case 32:
if 48 <= data[p] && data[p] <= 57 { goto st32 }
goto st0
tr66:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st33
st33:
@ -844,7 +844,7 @@ case 33:
if 48 <= data[p] && data[p] <= 57 { goto tr69 }
goto st0
tr69:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st34
st34:
@ -860,7 +860,7 @@ case 34:
if 48 <= data[p] && data[p] <= 57 { goto st34 }
goto st0
tr70:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st35
st35:
@ -876,7 +876,7 @@ case 35:
if 48 <= data[p] && data[p] <= 57 { goto tr73 }
goto st0
tr73:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st36
st36:
@ -892,7 +892,7 @@ case 36:
if 48 <= data[p] && data[p] <= 57 { goto st36 }
goto st0
tr74:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st37
st37:
@ -917,7 +917,7 @@ case 37:
}
goto st0
tr77:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st105
st105:
@ -942,13 +942,13 @@ case 105:
}
goto st0
tr9:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st38
tr21:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st38
st38:
@ -973,7 +973,7 @@ case 39:
}
goto st0
tr79:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -997,7 +997,7 @@ case 40:
if 48 <= data[p] && data[p] <= 57 { goto tr81 }
goto st0
tr81:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st41
st41:
@ -1013,7 +1013,7 @@ case 41:
if 48 <= data[p] && data[p] <= 57 { goto st41 }
goto st0
tr82:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st42
st42:
@ -1038,7 +1038,7 @@ case 42:
}
goto st0
tr85:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st106
st106:
@ -1063,7 +1063,7 @@ case 106:
}
goto st0
tr34:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st43
st43:
@ -1088,7 +1088,7 @@ case 44:
}
goto st0
tr87:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -1121,7 +1121,7 @@ case 45:
}
goto st0
tr89:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st107
st107:
@ -1146,13 +1146,13 @@ case 107:
}
goto st0
tr11:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st46
tr23:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st46
st46:
@ -1207,7 +1207,7 @@ case 50:
}
goto st0
tr94:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -1231,7 +1231,7 @@ case 51:
if 48 <= data[p] && data[p] <= 57 { goto tr96 }
goto st0
tr96:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st52
st52:
@ -1247,7 +1247,7 @@ case 52:
if 48 <= data[p] && data[p] <= 57 { goto st52 }
goto st0
tr97:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st53
st53:
@ -1263,7 +1263,7 @@ case 53:
if 48 <= data[p] && data[p] <= 57 { goto tr100 }
goto st0
tr100:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st54
st54:
@ -1279,7 +1279,7 @@ case 54:
if 48 <= data[p] && data[p] <= 57 { goto st54 }
goto st0
tr101:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st55
st55:
@ -1295,7 +1295,7 @@ case 55:
if 48 <= data[p] && data[p] <= 57 { goto tr104 }
goto st0
tr104:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st56
st56:
@ -1311,7 +1311,7 @@ case 56:
if 48 <= data[p] && data[p] <= 57 { goto st56 }
goto st0
tr105:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st57
st57:
@ -1327,7 +1327,7 @@ case 57:
if 48 <= data[p] && data[p] <= 57 { goto tr108 }
goto st0
tr108:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st58
st58:
@ -1343,7 +1343,7 @@ case 58:
if 48 <= data[p] && data[p] <= 57 { goto st58 }
goto st0
tr109:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st59
st59:
@ -1359,7 +1359,7 @@ case 59:
if 48 <= data[p] && data[p] <= 57 { goto tr112 }
goto st0
tr112:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st60
st60:
@ -1375,7 +1375,7 @@ case 60:
if 48 <= data[p] && data[p] <= 57 { goto st60 }
goto st0
tr113:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st61
st61:
@ -1391,7 +1391,7 @@ case 61:
if 48 <= data[p] && data[p] <= 57 { goto tr116 }
goto st0
tr116:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st62
st62:
@ -1407,7 +1407,7 @@ case 62:
if 48 <= data[p] && data[p] <= 57 { goto st62 }
goto st0
tr117:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st63
st63:
@ -1423,7 +1423,7 @@ case 63:
if 48 <= data[p] && data[p] <= 57 { goto tr120 }
goto st0
tr120:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st64
st64:
@ -1439,7 +1439,7 @@ case 64:
if 48 <= data[p] && data[p] <= 57 { goto st64 }
goto st0
tr121:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st65
st65:
@ -1464,7 +1464,7 @@ case 65:
}
goto st0
tr124:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st66
st66:
@ -1489,7 +1489,7 @@ case 66:
}
goto st0
tr125:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
goto st67
st67:
@ -1514,7 +1514,7 @@ case 67:
}
goto st0
tr128:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st108
st108:
@ -1539,13 +1539,13 @@ case 108:
}
goto st0
tr12:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st68
tr24:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st68
st68:
@ -1580,7 +1580,7 @@ case 70:
}
goto st0
tr131:
// line 92 "zparse.rl"
// line 93 "zparse.rl"
{
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
@ -1613,7 +1613,7 @@ case 71:
}
goto st0
tr133:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st72
st72:
@ -1638,7 +1638,7 @@ case 72:
}
goto st0
tr134:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
goto st73
st73:
@ -1663,7 +1663,7 @@ case 73:
}
goto st0
tr137:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st74
st74:
@ -1688,7 +1688,7 @@ case 74:
}
goto st0
tr138:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
goto st75
st75:
@ -1704,7 +1704,7 @@ case 75:
if 48 <= data[p] && data[p] <= 57 { goto tr141 }
goto st0
tr141:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st76
st76:
@ -1720,7 +1720,7 @@ case 76:
if 48 <= data[p] && data[p] <= 57 { goto st76 }
goto st0
tr142:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st77
st77:
@ -1736,7 +1736,7 @@ case 77:
if 48 <= data[p] && data[p] <= 57 { goto tr145 }
goto st0
tr145:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st78
st78:
@ -1752,7 +1752,7 @@ case 78:
if 48 <= data[p] && data[p] <= 57 { goto st78 }
goto st0
tr146:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st79
st79:
@ -1768,7 +1768,7 @@ case 79:
if 48 <= data[p] && data[p] <= 57 { goto tr149 }
goto st0
tr149:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st80
st80:
@ -1784,7 +1784,7 @@ case 80:
if 48 <= data[p] && data[p] <= 57 { goto st80 }
goto st0
tr150:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st81
st81:
@ -1800,7 +1800,7 @@ case 81:
if 48 <= data[p] && data[p] <= 57 { goto tr153 }
goto st0
tr153:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st82
st82:
@ -1816,7 +1816,7 @@ case 82:
if 48 <= data[p] && data[p] <= 57 { goto st82 }
goto st0
tr154:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
goto st83
st83:
@ -1832,7 +1832,7 @@ case 83:
if 48 <= data[p] && data[p] <= 57 { goto tr157 }
goto st0
tr157:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st109
st109:
@ -1856,7 +1856,7 @@ case 109:
}
goto st0
tr185:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
// line 16 "types.rl"
{
@ -1891,7 +1891,7 @@ case 84:
}
goto st0
tr17:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st85
st85:
@ -1910,7 +1910,7 @@ case 85:
}
goto st0
tr19:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st86
st86:
@ -1925,7 +1925,7 @@ case 86:
}
goto st0
tr20:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st87
st87:
@ -1940,7 +1940,7 @@ case 87:
}
goto st0
tr22:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st88
st88:
@ -1977,9 +1977,9 @@ case 90:
}
goto st0
tr4:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st91
st91:
@ -2016,7 +2016,7 @@ case 93:
}
goto st0
tr163:
// line 85 "zparse.rl"
// line 86 "zparse.rl"
{ hdr.Class = Str_class[data[mark:p]] }
goto st94
st94:
@ -2046,7 +2046,7 @@ case 94:
if 48 <= data[p] && data[p] <= 57 { goto tr165 }
goto st0
tr165:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
goto st95
st95:
@ -2062,9 +2062,9 @@ case 95:
if 48 <= data[p] && data[p] <= 57 { goto st95 }
goto st0
tr5:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st96
st96:
@ -2083,9 +2083,9 @@ case 96:
}
goto st0
tr7:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st97
st97:
@ -2100,9 +2100,9 @@ case 97:
}
goto st0
tr8:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st98
st98:
@ -2117,9 +2117,9 @@ case 98:
}
goto st0
tr10:
// line 83 "zparse.rl"
// line 84 "zparse.rl"
{ mark = p }
// line 86 "zparse.rl"
// line 87 "zparse.rl"
{ /* ... */ }
goto st99
st99:
@ -2269,7 +2269,7 @@ case 101:
if p == eof {
switch cs {
case 109:
// line 88 "zparse.rl"
// line 89 "zparse.rl"
{ tok.pushInt(data[mark:p]) }
// line 16 "types.rl"
{
@ -2284,7 +2284,7 @@ case 101:
}
break
case 102:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 4 "types.rl"
{
@ -2293,7 +2293,7 @@ case 101:
}
break
case 107:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 8 "types.rl"
{
@ -2302,7 +2302,7 @@ case 101:
}
break
case 103:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 12 "types.rl"
{
@ -2311,7 +2311,7 @@ case 101:
}
break
case 106:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 26 "types.rl"
{
@ -2321,7 +2321,7 @@ case 101:
}
break
case 105:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 31 "types.rl"
{
@ -2333,7 +2333,7 @@ case 101:
}
break
case 104:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 38 "types.rl"
{
@ -2345,7 +2345,7 @@ case 101:
}
break
case 108:
// line 89 "zparse.rl"
// line 90 "zparse.rl"
{ tok.pushString(data[mark:p]) }
// line 45 "types.rl"
{
@ -2368,7 +2368,7 @@ case 101:
_out: {}
}
// line 137 "zparse.rl"
// line 139 "zparse.rl"
if cs < z_first_final {

View File

@ -80,6 +80,7 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
tok := newToken()
%%{
# can't do comments yet
action mark { mark = p }
action qname { hdr.Name = data[mark:p] }
action qclass { hdr.Class = Str_class[data[mark:p]] }
@ -108,6 +109,7 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
# t = [a-zA-Z0-9.\\]+ $1 %0 %text;
t = [a-zA-Z0-9.\\/+=]+ $1 %0 %text;
n = [0-9]+ $1 %0 %number;
comment = /^;/;
lhs = qname? bl %defTtl (
(ttl %setTtl bl (qclass bl)?)