@@ -3,6 +3,7 @@ package dns
33import (
44 "bytes"
55 "encoding/base64"
6+ "errors"
67 "net"
78 "strconv"
89 "strings"
@@ -1216,6 +1217,117 @@ func (rr *DS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c,
12161217func (rr * DLV ) parse (c * zlexer , o string ) * ParseError { return rr .parseDS (c , o , "DLV" ) }
12171218func (rr * CDS ) parse (c * zlexer , o string ) * ParseError { return rr .parseDS (c , o , "CDS" ) }
12181219
1220+ func (rr * IPSECKEY ) parse (c * zlexer , o string ) * ParseError {
1221+ l , _ := c .Next ()
1222+ num , err := strconv .ParseUint (l .token , 10 , 8 )
1223+ if err != nil || l .err {
1224+ return & ParseError {"" , "bad IPSECKEY value" , l }
1225+ }
1226+ rr .Precedence = uint8 (num )
1227+ c .Next () // zBlank
1228+
1229+ l , _ = c .Next ()
1230+ num , err = strconv .ParseUint (l .token , 10 , 8 )
1231+ if err != nil || l .err {
1232+ return & ParseError {"" , "bad IPSECKEY value" , l }
1233+ }
1234+ rr .GatewayType = uint8 (num )
1235+ c .Next () // zBlank
1236+
1237+ l , _ = c .Next ()
1238+ num , err = strconv .ParseUint (l .token , 10 , 8 )
1239+ if err != nil || l .err {
1240+ return & ParseError {"" , "bad IPSECKEY value" , l }
1241+ }
1242+ rr .Algorithm = uint8 (num )
1243+ c .Next () // zBlank
1244+
1245+ l , _ = c .Next ()
1246+ if l .err {
1247+ return & ParseError {"" , "bad IPSECKEY gateway" , l }
1248+ }
1249+
1250+ rr .GatewayAddr , rr .GatewayHost , err = parseAddrHostUnion (l .token , o , rr .GatewayType )
1251+ if err != nil {
1252+ return & ParseError {"" , "AMTRELAY " + err .Error (), l }
1253+ }
1254+
1255+ c .Next () // zBlank
1256+
1257+ s , pErr := endingToString (c , "bad IPSECKEY PublicKey" )
1258+ if pErr != nil {
1259+ return pErr
1260+ }
1261+ rr .PublicKey = s
1262+ return slurpRemainder (c )
1263+ }
1264+
1265+ func (rr * AMTRELAY ) parse (c * zlexer , o string ) * ParseError {
1266+ l , _ := c .Next ()
1267+ num , err := strconv .ParseUint (l .token , 10 , 8 )
1268+ if err != nil || l .err {
1269+ return & ParseError {"" , "bad AMTRELAY value" , l }
1270+ }
1271+ rr .Precedence = uint8 (num )
1272+ c .Next () // zBlank
1273+
1274+ l , _ = c .Next ()
1275+ if l .err || ! (l .token == "0" || l .token == "1" ) {
1276+ return & ParseError {"" , "bad discovery value" , l }
1277+ }
1278+ if l .token == "1" {
1279+ rr .GatewayType = 0x80
1280+ }
1281+
1282+ c .Next () // zBlank
1283+
1284+ l , _ = c .Next ()
1285+ num , err = strconv .ParseUint (l .token , 10 , 8 )
1286+ if err != nil || l .err {
1287+ return & ParseError {"" , "bad AMTRELAY value" , l }
1288+ }
1289+ rr .GatewayType |= uint8 (num )
1290+ c .Next () // zBlank
1291+
1292+ l , _ = c .Next ()
1293+ if l .err {
1294+ return & ParseError {"" , "bad AMTRELAY gateway" , l }
1295+ }
1296+
1297+ rr .GatewayAddr , rr .GatewayHost , err = parseAddrHostUnion (l .token , o , rr .GatewayType & 0x7f )
1298+ if err != nil {
1299+ return & ParseError {"" , "AMTRELAY " + err .Error (), l }
1300+ }
1301+
1302+ return slurpRemainder (c )
1303+ }
1304+
1305+ // same constants and parsing between IPSECKEY and AMTRELAY
1306+ func parseAddrHostUnion (token , o string , gatewayType uint8 ) (addr net.IP , host string , err error ) {
1307+ switch gatewayType {
1308+ case IPSECGatewayNone :
1309+ if token != "." {
1310+ return addr , host , errors .New ("gateway type none with gateway set" )
1311+ }
1312+ case IPSECGatewayIPv4 , IPSECGatewayIPv6 :
1313+ addr = net .ParseIP (token )
1314+ if addr == nil {
1315+ return addr , host , errors .New ("gateway IP invalid" )
1316+ }
1317+ if (addr .To4 () == nil ) == (gatewayType == IPSECGatewayIPv4 ) {
1318+ return addr , host , errors .New ("gateway IP family mismatch" )
1319+ }
1320+ case IPSECGatewayHost :
1321+ var ok bool
1322+ host , ok = toAbsoluteName (token , o )
1323+ if ! ok {
1324+ return addr , host , errors .New ("invalid gateway host" )
1325+ }
1326+ }
1327+
1328+ return addr , host , nil
1329+ }
1330+
12191331func (rr * RKEY ) parse (c * zlexer , o string ) * ParseError {
12201332 l , _ := c .Next ()
12211333 i , e := strconv .ParseUint (l .token , 10 , 16 )
0 commit comments