scan_rr.go 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743
  1. package dns
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "net"
  6. "strconv"
  7. "strings"
  8. )
  9. // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces)
  10. // or an error
  11. func endingToString(c *zlexer, errstr string) (string, *ParseError) {
  12. var buffer bytes.Buffer
  13. l, _ := c.Next() // zString
  14. for l.value != zNewline && l.value != zEOF {
  15. if l.err {
  16. return buffer.String(), &ParseError{"", errstr, l}
  17. }
  18. switch l.value {
  19. case zString:
  20. buffer.WriteString(l.token)
  21. case zBlank: // Ok
  22. default:
  23. return "", &ParseError{"", errstr, l}
  24. }
  25. l, _ = c.Next()
  26. }
  27. return buffer.String(), nil
  28. }
  29. // A remainder of the rdata with embedded spaces, split on unquoted whitespace
  30. // and return the parsed string slice or an error
  31. func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) {
  32. // Get the remaining data until we see a zNewline
  33. l, _ := c.Next()
  34. if l.err {
  35. return nil, &ParseError{"", errstr, l}
  36. }
  37. // Build the slice
  38. s := make([]string, 0)
  39. quote := false
  40. empty := false
  41. for l.value != zNewline && l.value != zEOF {
  42. if l.err {
  43. return nil, &ParseError{"", errstr, l}
  44. }
  45. switch l.value {
  46. case zString:
  47. empty = false
  48. if len(l.token) > 255 {
  49. // split up tokens that are larger than 255 into 255-chunks
  50. sx := []string{}
  51. p, i := 0, 255
  52. for {
  53. if i <= len(l.token) {
  54. sx = append(sx, l.token[p:i])
  55. } else {
  56. sx = append(sx, l.token[p:])
  57. break
  58. }
  59. p, i = p+255, i+255
  60. }
  61. s = append(s, sx...)
  62. break
  63. }
  64. s = append(s, l.token)
  65. case zBlank:
  66. if quote {
  67. // zBlank can only be seen in between txt parts.
  68. return nil, &ParseError{"", errstr, l}
  69. }
  70. case zQuote:
  71. if empty && quote {
  72. s = append(s, "")
  73. }
  74. quote = !quote
  75. empty = true
  76. default:
  77. return nil, &ParseError{"", errstr, l}
  78. }
  79. l, _ = c.Next()
  80. }
  81. if quote {
  82. return nil, &ParseError{"", errstr, l}
  83. }
  84. return s, nil
  85. }
  86. func (rr *A) parse(c *zlexer, o string) *ParseError {
  87. l, _ := c.Next()
  88. rr.A = net.ParseIP(l.token)
  89. // IPv4 addresses cannot include ":".
  90. // We do this rather than use net.IP's To4() because
  91. // To4() treats IPv4-mapped IPv6 addresses as being
  92. // IPv4.
  93. isIPv4 := !strings.Contains(l.token, ":")
  94. if rr.A == nil || !isIPv4 || l.err {
  95. return &ParseError{"", "bad A A", l}
  96. }
  97. return slurpRemainder(c)
  98. }
  99. func (rr *AAAA) parse(c *zlexer, o string) *ParseError {
  100. l, _ := c.Next()
  101. rr.AAAA = net.ParseIP(l.token)
  102. // IPv6 addresses must include ":", and IPv4
  103. // addresses cannot include ":".
  104. isIPv6 := strings.Contains(l.token, ":")
  105. if rr.AAAA == nil || !isIPv6 || l.err {
  106. return &ParseError{"", "bad AAAA AAAA", l}
  107. }
  108. return slurpRemainder(c)
  109. }
  110. func (rr *NS) parse(c *zlexer, o string) *ParseError {
  111. l, _ := c.Next()
  112. name, nameOk := toAbsoluteName(l.token, o)
  113. if l.err || !nameOk {
  114. return &ParseError{"", "bad NS Ns", l}
  115. }
  116. rr.Ns = name
  117. return slurpRemainder(c)
  118. }
  119. func (rr *PTR) parse(c *zlexer, o string) *ParseError {
  120. l, _ := c.Next()
  121. name, nameOk := toAbsoluteName(l.token, o)
  122. if l.err || !nameOk {
  123. return &ParseError{"", "bad PTR Ptr", l}
  124. }
  125. rr.Ptr = name
  126. return slurpRemainder(c)
  127. }
  128. func (rr *NSAPPTR) parse(c *zlexer, o string) *ParseError {
  129. l, _ := c.Next()
  130. name, nameOk := toAbsoluteName(l.token, o)
  131. if l.err || !nameOk {
  132. return &ParseError{"", "bad NSAP-PTR Ptr", l}
  133. }
  134. rr.Ptr = name
  135. return slurpRemainder(c)
  136. }
  137. func (rr *RP) parse(c *zlexer, o string) *ParseError {
  138. l, _ := c.Next()
  139. mbox, mboxOk := toAbsoluteName(l.token, o)
  140. if l.err || !mboxOk {
  141. return &ParseError{"", "bad RP Mbox", l}
  142. }
  143. rr.Mbox = mbox
  144. c.Next() // zBlank
  145. l, _ = c.Next()
  146. rr.Txt = l.token
  147. txt, txtOk := toAbsoluteName(l.token, o)
  148. if l.err || !txtOk {
  149. return &ParseError{"", "bad RP Txt", l}
  150. }
  151. rr.Txt = txt
  152. return slurpRemainder(c)
  153. }
  154. func (rr *MR) parse(c *zlexer, o string) *ParseError {
  155. l, _ := c.Next()
  156. name, nameOk := toAbsoluteName(l.token, o)
  157. if l.err || !nameOk {
  158. return &ParseError{"", "bad MR Mr", l}
  159. }
  160. rr.Mr = name
  161. return slurpRemainder(c)
  162. }
  163. func (rr *MB) parse(c *zlexer, o string) *ParseError {
  164. l, _ := c.Next()
  165. name, nameOk := toAbsoluteName(l.token, o)
  166. if l.err || !nameOk {
  167. return &ParseError{"", "bad MB Mb", l}
  168. }
  169. rr.Mb = name
  170. return slurpRemainder(c)
  171. }
  172. func (rr *MG) parse(c *zlexer, o string) *ParseError {
  173. l, _ := c.Next()
  174. name, nameOk := toAbsoluteName(l.token, o)
  175. if l.err || !nameOk {
  176. return &ParseError{"", "bad MG Mg", l}
  177. }
  178. rr.Mg = name
  179. return slurpRemainder(c)
  180. }
  181. func (rr *HINFO) parse(c *zlexer, o string) *ParseError {
  182. chunks, e := endingToTxtSlice(c, "bad HINFO Fields")
  183. if e != nil {
  184. return e
  185. }
  186. if ln := len(chunks); ln == 0 {
  187. return nil
  188. } else if ln == 1 {
  189. // Can we split it?
  190. if out := strings.Fields(chunks[0]); len(out) > 1 {
  191. chunks = out
  192. } else {
  193. chunks = append(chunks, "")
  194. }
  195. }
  196. rr.Cpu = chunks[0]
  197. rr.Os = strings.Join(chunks[1:], " ")
  198. return nil
  199. }
  200. func (rr *MINFO) parse(c *zlexer, o string) *ParseError {
  201. l, _ := c.Next()
  202. rmail, rmailOk := toAbsoluteName(l.token, o)
  203. if l.err || !rmailOk {
  204. return &ParseError{"", "bad MINFO Rmail", l}
  205. }
  206. rr.Rmail = rmail
  207. c.Next() // zBlank
  208. l, _ = c.Next()
  209. rr.Email = l.token
  210. email, emailOk := toAbsoluteName(l.token, o)
  211. if l.err || !emailOk {
  212. return &ParseError{"", "bad MINFO Email", l}
  213. }
  214. rr.Email = email
  215. return slurpRemainder(c)
  216. }
  217. func (rr *MF) parse(c *zlexer, o string) *ParseError {
  218. l, _ := c.Next()
  219. name, nameOk := toAbsoluteName(l.token, o)
  220. if l.err || !nameOk {
  221. return &ParseError{"", "bad MF Mf", l}
  222. }
  223. rr.Mf = name
  224. return slurpRemainder(c)
  225. }
  226. func (rr *MD) parse(c *zlexer, o string) *ParseError {
  227. l, _ := c.Next()
  228. name, nameOk := toAbsoluteName(l.token, o)
  229. if l.err || !nameOk {
  230. return &ParseError{"", "bad MD Md", l}
  231. }
  232. rr.Md = name
  233. return slurpRemainder(c)
  234. }
  235. func (rr *MX) parse(c *zlexer, o string) *ParseError {
  236. l, _ := c.Next()
  237. i, e := strconv.ParseUint(l.token, 10, 16)
  238. if e != nil || l.err {
  239. return &ParseError{"", "bad MX Pref", l}
  240. }
  241. rr.Preference = uint16(i)
  242. c.Next() // zBlank
  243. l, _ = c.Next() // zString
  244. rr.Mx = l.token
  245. name, nameOk := toAbsoluteName(l.token, o)
  246. if l.err || !nameOk {
  247. return &ParseError{"", "bad MX Mx", l}
  248. }
  249. rr.Mx = name
  250. return slurpRemainder(c)
  251. }
  252. func (rr *RT) parse(c *zlexer, o string) *ParseError {
  253. l, _ := c.Next()
  254. i, e := strconv.ParseUint(l.token, 10, 16)
  255. if e != nil {
  256. return &ParseError{"", "bad RT Preference", l}
  257. }
  258. rr.Preference = uint16(i)
  259. c.Next() // zBlank
  260. l, _ = c.Next() // zString
  261. rr.Host = l.token
  262. name, nameOk := toAbsoluteName(l.token, o)
  263. if l.err || !nameOk {
  264. return &ParseError{"", "bad RT Host", l}
  265. }
  266. rr.Host = name
  267. return slurpRemainder(c)
  268. }
  269. func (rr *AFSDB) parse(c *zlexer, o string) *ParseError {
  270. l, _ := c.Next()
  271. i, e := strconv.ParseUint(l.token, 10, 16)
  272. if e != nil || l.err {
  273. return &ParseError{"", "bad AFSDB Subtype", l}
  274. }
  275. rr.Subtype = uint16(i)
  276. c.Next() // zBlank
  277. l, _ = c.Next() // zString
  278. rr.Hostname = l.token
  279. name, nameOk := toAbsoluteName(l.token, o)
  280. if l.err || !nameOk {
  281. return &ParseError{"", "bad AFSDB Hostname", l}
  282. }
  283. rr.Hostname = name
  284. return slurpRemainder(c)
  285. }
  286. func (rr *X25) parse(c *zlexer, o string) *ParseError {
  287. l, _ := c.Next()
  288. if l.err {
  289. return &ParseError{"", "bad X25 PSDNAddress", l}
  290. }
  291. rr.PSDNAddress = l.token
  292. return slurpRemainder(c)
  293. }
  294. func (rr *KX) parse(c *zlexer, o string) *ParseError {
  295. l, _ := c.Next()
  296. i, e := strconv.ParseUint(l.token, 10, 16)
  297. if e != nil || l.err {
  298. return &ParseError{"", "bad KX Pref", l}
  299. }
  300. rr.Preference = uint16(i)
  301. c.Next() // zBlank
  302. l, _ = c.Next() // zString
  303. rr.Exchanger = l.token
  304. name, nameOk := toAbsoluteName(l.token, o)
  305. if l.err || !nameOk {
  306. return &ParseError{"", "bad KX Exchanger", l}
  307. }
  308. rr.Exchanger = name
  309. return slurpRemainder(c)
  310. }
  311. func (rr *CNAME) parse(c *zlexer, o string) *ParseError {
  312. l, _ := c.Next()
  313. name, nameOk := toAbsoluteName(l.token, o)
  314. if l.err || !nameOk {
  315. return &ParseError{"", "bad CNAME Target", l}
  316. }
  317. rr.Target = name
  318. return slurpRemainder(c)
  319. }
  320. func (rr *DNAME) parse(c *zlexer, o string) *ParseError {
  321. l, _ := c.Next()
  322. name, nameOk := toAbsoluteName(l.token, o)
  323. if l.err || !nameOk {
  324. return &ParseError{"", "bad DNAME Target", l}
  325. }
  326. rr.Target = name
  327. return slurpRemainder(c)
  328. }
  329. func (rr *SOA) parse(c *zlexer, o string) *ParseError {
  330. l, _ := c.Next()
  331. ns, nsOk := toAbsoluteName(l.token, o)
  332. if l.err || !nsOk {
  333. return &ParseError{"", "bad SOA Ns", l}
  334. }
  335. rr.Ns = ns
  336. c.Next() // zBlank
  337. l, _ = c.Next()
  338. rr.Mbox = l.token
  339. mbox, mboxOk := toAbsoluteName(l.token, o)
  340. if l.err || !mboxOk {
  341. return &ParseError{"", "bad SOA Mbox", l}
  342. }
  343. rr.Mbox = mbox
  344. c.Next() // zBlank
  345. var (
  346. v uint32
  347. ok bool
  348. )
  349. for i := 0; i < 5; i++ {
  350. l, _ = c.Next()
  351. if l.err {
  352. return &ParseError{"", "bad SOA zone parameter", l}
  353. }
  354. if j, err := strconv.ParseUint(l.token, 10, 32); err != nil {
  355. if i == 0 {
  356. // Serial must be a number
  357. return &ParseError{"", "bad SOA zone parameter", l}
  358. }
  359. // We allow other fields to be unitful duration strings
  360. if v, ok = stringToTTL(l.token); !ok {
  361. return &ParseError{"", "bad SOA zone parameter", l}
  362. }
  363. } else {
  364. v = uint32(j)
  365. }
  366. switch i {
  367. case 0:
  368. rr.Serial = v
  369. c.Next() // zBlank
  370. case 1:
  371. rr.Refresh = v
  372. c.Next() // zBlank
  373. case 2:
  374. rr.Retry = v
  375. c.Next() // zBlank
  376. case 3:
  377. rr.Expire = v
  378. c.Next() // zBlank
  379. case 4:
  380. rr.Minttl = v
  381. }
  382. }
  383. return slurpRemainder(c)
  384. }
  385. func (rr *SRV) parse(c *zlexer, o string) *ParseError {
  386. l, _ := c.Next()
  387. i, e := strconv.ParseUint(l.token, 10, 16)
  388. if e != nil || l.err {
  389. return &ParseError{"", "bad SRV Priority", l}
  390. }
  391. rr.Priority = uint16(i)
  392. c.Next() // zBlank
  393. l, _ = c.Next() // zString
  394. i, e1 := strconv.ParseUint(l.token, 10, 16)
  395. if e1 != nil || l.err {
  396. return &ParseError{"", "bad SRV Weight", l}
  397. }
  398. rr.Weight = uint16(i)
  399. c.Next() // zBlank
  400. l, _ = c.Next() // zString
  401. i, e2 := strconv.ParseUint(l.token, 10, 16)
  402. if e2 != nil || l.err {
  403. return &ParseError{"", "bad SRV Port", l}
  404. }
  405. rr.Port = uint16(i)
  406. c.Next() // zBlank
  407. l, _ = c.Next() // zString
  408. rr.Target = l.token
  409. name, nameOk := toAbsoluteName(l.token, o)
  410. if l.err || !nameOk {
  411. return &ParseError{"", "bad SRV Target", l}
  412. }
  413. rr.Target = name
  414. return slurpRemainder(c)
  415. }
  416. func (rr *NAPTR) parse(c *zlexer, o string) *ParseError {
  417. l, _ := c.Next()
  418. i, e := strconv.ParseUint(l.token, 10, 16)
  419. if e != nil || l.err {
  420. return &ParseError{"", "bad NAPTR Order", l}
  421. }
  422. rr.Order = uint16(i)
  423. c.Next() // zBlank
  424. l, _ = c.Next() // zString
  425. i, e1 := strconv.ParseUint(l.token, 10, 16)
  426. if e1 != nil || l.err {
  427. return &ParseError{"", "bad NAPTR Preference", l}
  428. }
  429. rr.Preference = uint16(i)
  430. // Flags
  431. c.Next() // zBlank
  432. l, _ = c.Next() // _QUOTE
  433. if l.value != zQuote {
  434. return &ParseError{"", "bad NAPTR Flags", l}
  435. }
  436. l, _ = c.Next() // Either String or Quote
  437. if l.value == zString {
  438. rr.Flags = l.token
  439. l, _ = c.Next() // _QUOTE
  440. if l.value != zQuote {
  441. return &ParseError{"", "bad NAPTR Flags", l}
  442. }
  443. } else if l.value == zQuote {
  444. rr.Flags = ""
  445. } else {
  446. return &ParseError{"", "bad NAPTR Flags", l}
  447. }
  448. // Service
  449. c.Next() // zBlank
  450. l, _ = c.Next() // _QUOTE
  451. if l.value != zQuote {
  452. return &ParseError{"", "bad NAPTR Service", l}
  453. }
  454. l, _ = c.Next() // Either String or Quote
  455. if l.value == zString {
  456. rr.Service = l.token
  457. l, _ = c.Next() // _QUOTE
  458. if l.value != zQuote {
  459. return &ParseError{"", "bad NAPTR Service", l}
  460. }
  461. } else if l.value == zQuote {
  462. rr.Service = ""
  463. } else {
  464. return &ParseError{"", "bad NAPTR Service", l}
  465. }
  466. // Regexp
  467. c.Next() // zBlank
  468. l, _ = c.Next() // _QUOTE
  469. if l.value != zQuote {
  470. return &ParseError{"", "bad NAPTR Regexp", l}
  471. }
  472. l, _ = c.Next() // Either String or Quote
  473. if l.value == zString {
  474. rr.Regexp = l.token
  475. l, _ = c.Next() // _QUOTE
  476. if l.value != zQuote {
  477. return &ParseError{"", "bad NAPTR Regexp", l}
  478. }
  479. } else if l.value == zQuote {
  480. rr.Regexp = ""
  481. } else {
  482. return &ParseError{"", "bad NAPTR Regexp", l}
  483. }
  484. // After quote no space??
  485. c.Next() // zBlank
  486. l, _ = c.Next() // zString
  487. rr.Replacement = l.token
  488. name, nameOk := toAbsoluteName(l.token, o)
  489. if l.err || !nameOk {
  490. return &ParseError{"", "bad NAPTR Replacement", l}
  491. }
  492. rr.Replacement = name
  493. return slurpRemainder(c)
  494. }
  495. func (rr *TALINK) parse(c *zlexer, o string) *ParseError {
  496. l, _ := c.Next()
  497. previousName, previousNameOk := toAbsoluteName(l.token, o)
  498. if l.err || !previousNameOk {
  499. return &ParseError{"", "bad TALINK PreviousName", l}
  500. }
  501. rr.PreviousName = previousName
  502. c.Next() // zBlank
  503. l, _ = c.Next()
  504. rr.NextName = l.token
  505. nextName, nextNameOk := toAbsoluteName(l.token, o)
  506. if l.err || !nextNameOk {
  507. return &ParseError{"", "bad TALINK NextName", l}
  508. }
  509. rr.NextName = nextName
  510. return slurpRemainder(c)
  511. }
  512. func (rr *LOC) parse(c *zlexer, o string) *ParseError {
  513. // Non zero defaults for LOC record, see RFC 1876, Section 3.
  514. rr.Size = 0x12 // 1e2 cm (1m)
  515. rr.HorizPre = 0x16 // 1e6 cm (10000m)
  516. rr.VertPre = 0x13 // 1e3 cm (10m)
  517. ok := false
  518. // North
  519. l, _ := c.Next()
  520. i, e := strconv.ParseUint(l.token, 10, 32)
  521. if e != nil || l.err {
  522. return &ParseError{"", "bad LOC Latitude", l}
  523. }
  524. rr.Latitude = 1000 * 60 * 60 * uint32(i)
  525. c.Next() // zBlank
  526. // Either number, 'N' or 'S'
  527. l, _ = c.Next()
  528. if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
  529. goto East
  530. }
  531. if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err {
  532. return &ParseError{"", "bad LOC Latitude minutes", l}
  533. } else {
  534. rr.Latitude += 1000 * 60 * uint32(i)
  535. }
  536. c.Next() // zBlank
  537. l, _ = c.Next()
  538. if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err {
  539. return &ParseError{"", "bad LOC Latitude seconds", l}
  540. } else {
  541. rr.Latitude += uint32(1000 * i)
  542. }
  543. c.Next() // zBlank
  544. // Either number, 'N' or 'S'
  545. l, _ = c.Next()
  546. if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
  547. goto East
  548. }
  549. // If still alive, flag an error
  550. return &ParseError{"", "bad LOC Latitude North/South", l}
  551. East:
  552. // East
  553. c.Next() // zBlank
  554. l, _ = c.Next()
  555. if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err {
  556. return &ParseError{"", "bad LOC Longitude", l}
  557. } else {
  558. rr.Longitude = 1000 * 60 * 60 * uint32(i)
  559. }
  560. c.Next() // zBlank
  561. // Either number, 'E' or 'W'
  562. l, _ = c.Next()
  563. if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
  564. goto Altitude
  565. }
  566. if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err {
  567. return &ParseError{"", "bad LOC Longitude minutes", l}
  568. } else {
  569. rr.Longitude += 1000 * 60 * uint32(i)
  570. }
  571. c.Next() // zBlank
  572. l, _ = c.Next()
  573. if i, err := strconv.ParseFloat(l.token, 32); err != nil || l.err {
  574. return &ParseError{"", "bad LOC Longitude seconds", l}
  575. } else {
  576. rr.Longitude += uint32(1000 * i)
  577. }
  578. c.Next() // zBlank
  579. // Either number, 'E' or 'W'
  580. l, _ = c.Next()
  581. if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
  582. goto Altitude
  583. }
  584. // If still alive, flag an error
  585. return &ParseError{"", "bad LOC Longitude East/West", l}
  586. Altitude:
  587. c.Next() // zBlank
  588. l, _ = c.Next()
  589. if len(l.token) == 0 || l.err {
  590. return &ParseError{"", "bad LOC Altitude", l}
  591. }
  592. if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' {
  593. l.token = l.token[0 : len(l.token)-1]
  594. }
  595. if i, err := strconv.ParseFloat(l.token, 32); err != nil {
  596. return &ParseError{"", "bad LOC Altitude", l}
  597. } else {
  598. rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5)
  599. }
  600. // And now optionally the other values
  601. l, _ = c.Next()
  602. count := 0
  603. for l.value != zNewline && l.value != zEOF {
  604. switch l.value {
  605. case zString:
  606. switch count {
  607. case 0: // Size
  608. exp, m, ok := stringToCm(l.token)
  609. if !ok {
  610. return &ParseError{"", "bad LOC Size", l}
  611. }
  612. rr.Size = exp&0x0f | m<<4&0xf0
  613. case 1: // HorizPre
  614. exp, m, ok := stringToCm(l.token)
  615. if !ok {
  616. return &ParseError{"", "bad LOC HorizPre", l}
  617. }
  618. rr.HorizPre = exp&0x0f | m<<4&0xf0
  619. case 2: // VertPre
  620. exp, m, ok := stringToCm(l.token)
  621. if !ok {
  622. return &ParseError{"", "bad LOC VertPre", l}
  623. }
  624. rr.VertPre = exp&0x0f | m<<4&0xf0
  625. }
  626. count++
  627. case zBlank:
  628. // Ok
  629. default:
  630. return &ParseError{"", "bad LOC Size, HorizPre or VertPre", l}
  631. }
  632. l, _ = c.Next()
  633. }
  634. return nil
  635. }
  636. func (rr *HIP) parse(c *zlexer, o string) *ParseError {
  637. // HitLength is not represented
  638. l, _ := c.Next()
  639. i, e := strconv.ParseUint(l.token, 10, 8)
  640. if e != nil || l.err {
  641. return &ParseError{"", "bad HIP PublicKeyAlgorithm", l}
  642. }
  643. rr.PublicKeyAlgorithm = uint8(i)
  644. c.Next() // zBlank
  645. l, _ = c.Next() // zString
  646. if len(l.token) == 0 || l.err {
  647. return &ParseError{"", "bad HIP Hit", l}
  648. }
  649. rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6.
  650. rr.HitLength = uint8(len(rr.Hit)) / 2
  651. c.Next() // zBlank
  652. l, _ = c.Next() // zString
  653. if len(l.token) == 0 || l.err {
  654. return &ParseError{"", "bad HIP PublicKey", l}
  655. }
  656. rr.PublicKey = l.token // This cannot contain spaces
  657. rr.PublicKeyLength = uint16(base64.StdEncoding.DecodedLen(len(rr.PublicKey)))
  658. // RendezvousServers (if any)
  659. l, _ = c.Next()
  660. var xs []string
  661. for l.value != zNewline && l.value != zEOF {
  662. switch l.value {
  663. case zString:
  664. name, nameOk := toAbsoluteName(l.token, o)
  665. if l.err || !nameOk {
  666. return &ParseError{"", "bad HIP RendezvousServers", l}
  667. }
  668. xs = append(xs, name)
  669. case zBlank:
  670. // Ok
  671. default:
  672. return &ParseError{"", "bad HIP RendezvousServers", l}
  673. }
  674. l, _ = c.Next()
  675. }
  676. rr.RendezvousServers = xs
  677. return nil
  678. }
  679. func (rr *CERT) parse(c *zlexer, o string) *ParseError {
  680. l, _ := c.Next()
  681. if v, ok := StringToCertType[l.token]; ok {
  682. rr.Type = v
  683. } else if i, err := strconv.ParseUint(l.token, 10, 16); err != nil {
  684. return &ParseError{"", "bad CERT Type", l}
  685. } else {
  686. rr.Type = uint16(i)
  687. }
  688. c.Next() // zBlank
  689. l, _ = c.Next() // zString
  690. i, e := strconv.ParseUint(l.token, 10, 16)
  691. if e != nil || l.err {
  692. return &ParseError{"", "bad CERT KeyTag", l}
  693. }
  694. rr.KeyTag = uint16(i)
  695. c.Next() // zBlank
  696. l, _ = c.Next() // zString
  697. if v, ok := StringToAlgorithm[l.token]; ok {
  698. rr.Algorithm = v
  699. } else if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  700. return &ParseError{"", "bad CERT Algorithm", l}
  701. } else {
  702. rr.Algorithm = uint8(i)
  703. }
  704. s, e1 := endingToString(c, "bad CERT Certificate")
  705. if e1 != nil {
  706. return e1
  707. }
  708. rr.Certificate = s
  709. return nil
  710. }
  711. func (rr *OPENPGPKEY) parse(c *zlexer, o string) *ParseError {
  712. s, e := endingToString(c, "bad OPENPGPKEY PublicKey")
  713. if e != nil {
  714. return e
  715. }
  716. rr.PublicKey = s
  717. return nil
  718. }
  719. func (rr *CSYNC) parse(c *zlexer, o string) *ParseError {
  720. l, _ := c.Next()
  721. j, e := strconv.ParseUint(l.token, 10, 32)
  722. if e != nil {
  723. // Serial must be a number
  724. return &ParseError{"", "bad CSYNC serial", l}
  725. }
  726. rr.Serial = uint32(j)
  727. c.Next() // zBlank
  728. l, _ = c.Next()
  729. j, e1 := strconv.ParseUint(l.token, 10, 16)
  730. if e1 != nil {
  731. // Serial must be a number
  732. return &ParseError{"", "bad CSYNC flags", l}
  733. }
  734. rr.Flags = uint16(j)
  735. rr.TypeBitMap = make([]uint16, 0)
  736. var (
  737. k uint16
  738. ok bool
  739. )
  740. l, _ = c.Next()
  741. for l.value != zNewline && l.value != zEOF {
  742. switch l.value {
  743. case zBlank:
  744. // Ok
  745. case zString:
  746. tokenUpper := strings.ToUpper(l.token)
  747. if k, ok = StringToType[tokenUpper]; !ok {
  748. if k, ok = typeToInt(l.token); !ok {
  749. return &ParseError{"", "bad CSYNC TypeBitMap", l}
  750. }
  751. }
  752. rr.TypeBitMap = append(rr.TypeBitMap, k)
  753. default:
  754. return &ParseError{"", "bad CSYNC TypeBitMap", l}
  755. }
  756. l, _ = c.Next()
  757. }
  758. return nil
  759. }
  760. func (rr *SIG) parse(c *zlexer, o string) *ParseError { return rr.RRSIG.parse(c, o) }
  761. func (rr *RRSIG) parse(c *zlexer, o string) *ParseError {
  762. l, _ := c.Next()
  763. tokenUpper := strings.ToUpper(l.token)
  764. if t, ok := StringToType[tokenUpper]; !ok {
  765. if strings.HasPrefix(tokenUpper, "TYPE") {
  766. t, ok = typeToInt(l.token)
  767. if !ok {
  768. return &ParseError{"", "bad RRSIG Typecovered", l}
  769. }
  770. rr.TypeCovered = t
  771. } else {
  772. return &ParseError{"", "bad RRSIG Typecovered", l}
  773. }
  774. } else {
  775. rr.TypeCovered = t
  776. }
  777. c.Next() // zBlank
  778. l, _ = c.Next()
  779. i, e := strconv.ParseUint(l.token, 10, 8)
  780. if e != nil || l.err {
  781. return &ParseError{"", "bad RRSIG Algorithm", l}
  782. }
  783. rr.Algorithm = uint8(i)
  784. c.Next() // zBlank
  785. l, _ = c.Next()
  786. i, e1 := strconv.ParseUint(l.token, 10, 8)
  787. if e1 != nil || l.err {
  788. return &ParseError{"", "bad RRSIG Labels", l}
  789. }
  790. rr.Labels = uint8(i)
  791. c.Next() // zBlank
  792. l, _ = c.Next()
  793. i, e2 := strconv.ParseUint(l.token, 10, 32)
  794. if e2 != nil || l.err {
  795. return &ParseError{"", "bad RRSIG OrigTtl", l}
  796. }
  797. rr.OrigTtl = uint32(i)
  798. c.Next() // zBlank
  799. l, _ = c.Next()
  800. if i, err := StringToTime(l.token); err != nil {
  801. // Try to see if all numeric and use it as epoch
  802. if i, err := strconv.ParseInt(l.token, 10, 64); err == nil {
  803. // TODO(miek): error out on > MAX_UINT32, same below
  804. rr.Expiration = uint32(i)
  805. } else {
  806. return &ParseError{"", "bad RRSIG Expiration", l}
  807. }
  808. } else {
  809. rr.Expiration = i
  810. }
  811. c.Next() // zBlank
  812. l, _ = c.Next()
  813. if i, err := StringToTime(l.token); err != nil {
  814. if i, err := strconv.ParseInt(l.token, 10, 64); err == nil {
  815. rr.Inception = uint32(i)
  816. } else {
  817. return &ParseError{"", "bad RRSIG Inception", l}
  818. }
  819. } else {
  820. rr.Inception = i
  821. }
  822. c.Next() // zBlank
  823. l, _ = c.Next()
  824. i, e3 := strconv.ParseUint(l.token, 10, 16)
  825. if e3 != nil || l.err {
  826. return &ParseError{"", "bad RRSIG KeyTag", l}
  827. }
  828. rr.KeyTag = uint16(i)
  829. c.Next() // zBlank
  830. l, _ = c.Next()
  831. rr.SignerName = l.token
  832. name, nameOk := toAbsoluteName(l.token, o)
  833. if l.err || !nameOk {
  834. return &ParseError{"", "bad RRSIG SignerName", l}
  835. }
  836. rr.SignerName = name
  837. s, e4 := endingToString(c, "bad RRSIG Signature")
  838. if e4 != nil {
  839. return e4
  840. }
  841. rr.Signature = s
  842. return nil
  843. }
  844. func (rr *NSEC) parse(c *zlexer, o string) *ParseError {
  845. l, _ := c.Next()
  846. name, nameOk := toAbsoluteName(l.token, o)
  847. if l.err || !nameOk {
  848. return &ParseError{"", "bad NSEC NextDomain", l}
  849. }
  850. rr.NextDomain = name
  851. rr.TypeBitMap = make([]uint16, 0)
  852. var (
  853. k uint16
  854. ok bool
  855. )
  856. l, _ = c.Next()
  857. for l.value != zNewline && l.value != zEOF {
  858. switch l.value {
  859. case zBlank:
  860. // Ok
  861. case zString:
  862. tokenUpper := strings.ToUpper(l.token)
  863. if k, ok = StringToType[tokenUpper]; !ok {
  864. if k, ok = typeToInt(l.token); !ok {
  865. return &ParseError{"", "bad NSEC TypeBitMap", l}
  866. }
  867. }
  868. rr.TypeBitMap = append(rr.TypeBitMap, k)
  869. default:
  870. return &ParseError{"", "bad NSEC TypeBitMap", l}
  871. }
  872. l, _ = c.Next()
  873. }
  874. return nil
  875. }
  876. func (rr *NSEC3) parse(c *zlexer, o string) *ParseError {
  877. l, _ := c.Next()
  878. i, e := strconv.ParseUint(l.token, 10, 8)
  879. if e != nil || l.err {
  880. return &ParseError{"", "bad NSEC3 Hash", l}
  881. }
  882. rr.Hash = uint8(i)
  883. c.Next() // zBlank
  884. l, _ = c.Next()
  885. i, e1 := strconv.ParseUint(l.token, 10, 8)
  886. if e1 != nil || l.err {
  887. return &ParseError{"", "bad NSEC3 Flags", l}
  888. }
  889. rr.Flags = uint8(i)
  890. c.Next() // zBlank
  891. l, _ = c.Next()
  892. i, e2 := strconv.ParseUint(l.token, 10, 16)
  893. if e2 != nil || l.err {
  894. return &ParseError{"", "bad NSEC3 Iterations", l}
  895. }
  896. rr.Iterations = uint16(i)
  897. c.Next()
  898. l, _ = c.Next()
  899. if len(l.token) == 0 || l.err {
  900. return &ParseError{"", "bad NSEC3 Salt", l}
  901. }
  902. if l.token != "-" {
  903. rr.SaltLength = uint8(len(l.token)) / 2
  904. rr.Salt = l.token
  905. }
  906. c.Next()
  907. l, _ = c.Next()
  908. if len(l.token) == 0 || l.err {
  909. return &ParseError{"", "bad NSEC3 NextDomain", l}
  910. }
  911. rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits)
  912. rr.NextDomain = l.token
  913. rr.TypeBitMap = make([]uint16, 0)
  914. var (
  915. k uint16
  916. ok bool
  917. )
  918. l, _ = c.Next()
  919. for l.value != zNewline && l.value != zEOF {
  920. switch l.value {
  921. case zBlank:
  922. // Ok
  923. case zString:
  924. tokenUpper := strings.ToUpper(l.token)
  925. if k, ok = StringToType[tokenUpper]; !ok {
  926. if k, ok = typeToInt(l.token); !ok {
  927. return &ParseError{"", "bad NSEC3 TypeBitMap", l}
  928. }
  929. }
  930. rr.TypeBitMap = append(rr.TypeBitMap, k)
  931. default:
  932. return &ParseError{"", "bad NSEC3 TypeBitMap", l}
  933. }
  934. l, _ = c.Next()
  935. }
  936. return nil
  937. }
  938. func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError {
  939. l, _ := c.Next()
  940. i, e := strconv.ParseUint(l.token, 10, 8)
  941. if e != nil || l.err {
  942. return &ParseError{"", "bad NSEC3PARAM Hash", l}
  943. }
  944. rr.Hash = uint8(i)
  945. c.Next() // zBlank
  946. l, _ = c.Next()
  947. i, e1 := strconv.ParseUint(l.token, 10, 8)
  948. if e1 != nil || l.err {
  949. return &ParseError{"", "bad NSEC3PARAM Flags", l}
  950. }
  951. rr.Flags = uint8(i)
  952. c.Next() // zBlank
  953. l, _ = c.Next()
  954. i, e2 := strconv.ParseUint(l.token, 10, 16)
  955. if e2 != nil || l.err {
  956. return &ParseError{"", "bad NSEC3PARAM Iterations", l}
  957. }
  958. rr.Iterations = uint16(i)
  959. c.Next()
  960. l, _ = c.Next()
  961. if l.token != "-" {
  962. rr.SaltLength = uint8(len(l.token) / 2)
  963. rr.Salt = l.token
  964. }
  965. return slurpRemainder(c)
  966. }
  967. func (rr *EUI48) parse(c *zlexer, o string) *ParseError {
  968. l, _ := c.Next()
  969. if len(l.token) != 17 || l.err {
  970. return &ParseError{"", "bad EUI48 Address", l}
  971. }
  972. addr := make([]byte, 12)
  973. dash := 0
  974. for i := 0; i < 10; i += 2 {
  975. addr[i] = l.token[i+dash]
  976. addr[i+1] = l.token[i+1+dash]
  977. dash++
  978. if l.token[i+1+dash] != '-' {
  979. return &ParseError{"", "bad EUI48 Address", l}
  980. }
  981. }
  982. addr[10] = l.token[15]
  983. addr[11] = l.token[16]
  984. i, e := strconv.ParseUint(string(addr), 16, 48)
  985. if e != nil {
  986. return &ParseError{"", "bad EUI48 Address", l}
  987. }
  988. rr.Address = i
  989. return slurpRemainder(c)
  990. }
  991. func (rr *EUI64) parse(c *zlexer, o string) *ParseError {
  992. l, _ := c.Next()
  993. if len(l.token) != 23 || l.err {
  994. return &ParseError{"", "bad EUI64 Address", l}
  995. }
  996. addr := make([]byte, 16)
  997. dash := 0
  998. for i := 0; i < 14; i += 2 {
  999. addr[i] = l.token[i+dash]
  1000. addr[i+1] = l.token[i+1+dash]
  1001. dash++
  1002. if l.token[i+1+dash] != '-' {
  1003. return &ParseError{"", "bad EUI64 Address", l}
  1004. }
  1005. }
  1006. addr[14] = l.token[21]
  1007. addr[15] = l.token[22]
  1008. i, e := strconv.ParseUint(string(addr), 16, 64)
  1009. if e != nil {
  1010. return &ParseError{"", "bad EUI68 Address", l}
  1011. }
  1012. rr.Address = i
  1013. return slurpRemainder(c)
  1014. }
  1015. func (rr *SSHFP) parse(c *zlexer, o string) *ParseError {
  1016. l, _ := c.Next()
  1017. i, e := strconv.ParseUint(l.token, 10, 8)
  1018. if e != nil || l.err {
  1019. return &ParseError{"", "bad SSHFP Algorithm", l}
  1020. }
  1021. rr.Algorithm = uint8(i)
  1022. c.Next() // zBlank
  1023. l, _ = c.Next()
  1024. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1025. if e1 != nil || l.err {
  1026. return &ParseError{"", "bad SSHFP Type", l}
  1027. }
  1028. rr.Type = uint8(i)
  1029. c.Next() // zBlank
  1030. s, e2 := endingToString(c, "bad SSHFP Fingerprint")
  1031. if e2 != nil {
  1032. return e2
  1033. }
  1034. rr.FingerPrint = s
  1035. return nil
  1036. }
  1037. func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError {
  1038. l, _ := c.Next()
  1039. i, e := strconv.ParseUint(l.token, 10, 16)
  1040. if e != nil || l.err {
  1041. return &ParseError{"", "bad " + typ + " Flags", l}
  1042. }
  1043. rr.Flags = uint16(i)
  1044. c.Next() // zBlank
  1045. l, _ = c.Next() // zString
  1046. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1047. if e1 != nil || l.err {
  1048. return &ParseError{"", "bad " + typ + " Protocol", l}
  1049. }
  1050. rr.Protocol = uint8(i)
  1051. c.Next() // zBlank
  1052. l, _ = c.Next() // zString
  1053. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1054. if e2 != nil || l.err {
  1055. return &ParseError{"", "bad " + typ + " Algorithm", l}
  1056. }
  1057. rr.Algorithm = uint8(i)
  1058. s, e3 := endingToString(c, "bad "+typ+" PublicKey")
  1059. if e3 != nil {
  1060. return e3
  1061. }
  1062. rr.PublicKey = s
  1063. return nil
  1064. }
  1065. func (rr *DNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "DNSKEY") }
  1066. func (rr *KEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "KEY") }
  1067. func (rr *CDNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "CDNSKEY") }
  1068. func (rr *DS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DS") }
  1069. func (rr *DLV) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DLV") }
  1070. func (rr *CDS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "CDS") }
  1071. func (rr *RKEY) parse(c *zlexer, o string) *ParseError {
  1072. l, _ := c.Next()
  1073. i, e := strconv.ParseUint(l.token, 10, 16)
  1074. if e != nil || l.err {
  1075. return &ParseError{"", "bad RKEY Flags", l}
  1076. }
  1077. rr.Flags = uint16(i)
  1078. c.Next() // zBlank
  1079. l, _ = c.Next() // zString
  1080. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1081. if e1 != nil || l.err {
  1082. return &ParseError{"", "bad RKEY Protocol", l}
  1083. }
  1084. rr.Protocol = uint8(i)
  1085. c.Next() // zBlank
  1086. l, _ = c.Next() // zString
  1087. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1088. if e2 != nil || l.err {
  1089. return &ParseError{"", "bad RKEY Algorithm", l}
  1090. }
  1091. rr.Algorithm = uint8(i)
  1092. s, e3 := endingToString(c, "bad RKEY PublicKey")
  1093. if e3 != nil {
  1094. return e3
  1095. }
  1096. rr.PublicKey = s
  1097. return nil
  1098. }
  1099. func (rr *EID) parse(c *zlexer, o string) *ParseError {
  1100. s, e := endingToString(c, "bad EID Endpoint")
  1101. if e != nil {
  1102. return e
  1103. }
  1104. rr.Endpoint = s
  1105. return nil
  1106. }
  1107. func (rr *NIMLOC) parse(c *zlexer, o string) *ParseError {
  1108. s, e := endingToString(c, "bad NIMLOC Locator")
  1109. if e != nil {
  1110. return e
  1111. }
  1112. rr.Locator = s
  1113. return nil
  1114. }
  1115. func (rr *GPOS) parse(c *zlexer, o string) *ParseError {
  1116. l, _ := c.Next()
  1117. _, e := strconv.ParseFloat(l.token, 64)
  1118. if e != nil || l.err {
  1119. return &ParseError{"", "bad GPOS Longitude", l}
  1120. }
  1121. rr.Longitude = l.token
  1122. c.Next() // zBlank
  1123. l, _ = c.Next()
  1124. _, e1 := strconv.ParseFloat(l.token, 64)
  1125. if e1 != nil || l.err {
  1126. return &ParseError{"", "bad GPOS Latitude", l}
  1127. }
  1128. rr.Latitude = l.token
  1129. c.Next() // zBlank
  1130. l, _ = c.Next()
  1131. _, e2 := strconv.ParseFloat(l.token, 64)
  1132. if e2 != nil || l.err {
  1133. return &ParseError{"", "bad GPOS Altitude", l}
  1134. }
  1135. rr.Altitude = l.token
  1136. return slurpRemainder(c)
  1137. }
  1138. func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError {
  1139. l, _ := c.Next()
  1140. i, e := strconv.ParseUint(l.token, 10, 16)
  1141. if e != nil || l.err {
  1142. return &ParseError{"", "bad " + typ + " KeyTag", l}
  1143. }
  1144. rr.KeyTag = uint16(i)
  1145. c.Next() // zBlank
  1146. l, _ = c.Next()
  1147. if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  1148. tokenUpper := strings.ToUpper(l.token)
  1149. i, ok := StringToAlgorithm[tokenUpper]
  1150. if !ok || l.err {
  1151. return &ParseError{"", "bad " + typ + " Algorithm", l}
  1152. }
  1153. rr.Algorithm = i
  1154. } else {
  1155. rr.Algorithm = uint8(i)
  1156. }
  1157. c.Next() // zBlank
  1158. l, _ = c.Next()
  1159. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1160. if e1 != nil || l.err {
  1161. return &ParseError{"", "bad " + typ + " DigestType", l}
  1162. }
  1163. rr.DigestType = uint8(i)
  1164. s, e2 := endingToString(c, "bad "+typ+" Digest")
  1165. if e2 != nil {
  1166. return e2
  1167. }
  1168. rr.Digest = s
  1169. return nil
  1170. }
  1171. func (rr *TA) parse(c *zlexer, o string) *ParseError {
  1172. l, _ := c.Next()
  1173. i, e := strconv.ParseUint(l.token, 10, 16)
  1174. if e != nil || l.err {
  1175. return &ParseError{"", "bad TA KeyTag", l}
  1176. }
  1177. rr.KeyTag = uint16(i)
  1178. c.Next() // zBlank
  1179. l, _ = c.Next()
  1180. if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  1181. tokenUpper := strings.ToUpper(l.token)
  1182. i, ok := StringToAlgorithm[tokenUpper]
  1183. if !ok || l.err {
  1184. return &ParseError{"", "bad TA Algorithm", l}
  1185. }
  1186. rr.Algorithm = i
  1187. } else {
  1188. rr.Algorithm = uint8(i)
  1189. }
  1190. c.Next() // zBlank
  1191. l, _ = c.Next()
  1192. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1193. if e1 != nil || l.err {
  1194. return &ParseError{"", "bad TA DigestType", l}
  1195. }
  1196. rr.DigestType = uint8(i)
  1197. s, e2 := endingToString(c, "bad TA Digest")
  1198. if e2 != nil {
  1199. return e2
  1200. }
  1201. rr.Digest = s
  1202. return nil
  1203. }
  1204. func (rr *TLSA) parse(c *zlexer, o string) *ParseError {
  1205. l, _ := c.Next()
  1206. i, e := strconv.ParseUint(l.token, 10, 8)
  1207. if e != nil || l.err {
  1208. return &ParseError{"", "bad TLSA Usage", l}
  1209. }
  1210. rr.Usage = uint8(i)
  1211. c.Next() // zBlank
  1212. l, _ = c.Next()
  1213. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1214. if e1 != nil || l.err {
  1215. return &ParseError{"", "bad TLSA Selector", l}
  1216. }
  1217. rr.Selector = uint8(i)
  1218. c.Next() // zBlank
  1219. l, _ = c.Next()
  1220. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1221. if e2 != nil || l.err {
  1222. return &ParseError{"", "bad TLSA MatchingType", l}
  1223. }
  1224. rr.MatchingType = uint8(i)
  1225. // So this needs be e2 (i.e. different than e), because...??t
  1226. s, e3 := endingToString(c, "bad TLSA Certificate")
  1227. if e3 != nil {
  1228. return e3
  1229. }
  1230. rr.Certificate = s
  1231. return nil
  1232. }
  1233. func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError {
  1234. l, _ := c.Next()
  1235. i, e := strconv.ParseUint(l.token, 10, 8)
  1236. if e != nil || l.err {
  1237. return &ParseError{"", "bad SMIMEA Usage", l}
  1238. }
  1239. rr.Usage = uint8(i)
  1240. c.Next() // zBlank
  1241. l, _ = c.Next()
  1242. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1243. if e1 != nil || l.err {
  1244. return &ParseError{"", "bad SMIMEA Selector", l}
  1245. }
  1246. rr.Selector = uint8(i)
  1247. c.Next() // zBlank
  1248. l, _ = c.Next()
  1249. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1250. if e2 != nil || l.err {
  1251. return &ParseError{"", "bad SMIMEA MatchingType", l}
  1252. }
  1253. rr.MatchingType = uint8(i)
  1254. // So this needs be e2 (i.e. different than e), because...??t
  1255. s, e3 := endingToString(c, "bad SMIMEA Certificate")
  1256. if e3 != nil {
  1257. return e3
  1258. }
  1259. rr.Certificate = s
  1260. return nil
  1261. }
  1262. func (rr *RFC3597) parse(c *zlexer, o string) *ParseError {
  1263. l, _ := c.Next()
  1264. if l.token != "\\#" {
  1265. return &ParseError{"", "bad RFC3597 Rdata", l}
  1266. }
  1267. c.Next() // zBlank
  1268. l, _ = c.Next()
  1269. rdlength, e := strconv.Atoi(l.token)
  1270. if e != nil || l.err {
  1271. return &ParseError{"", "bad RFC3597 Rdata ", l}
  1272. }
  1273. s, e1 := endingToString(c, "bad RFC3597 Rdata")
  1274. if e1 != nil {
  1275. return e1
  1276. }
  1277. if rdlength*2 != len(s) {
  1278. return &ParseError{"", "bad RFC3597 Rdata", l}
  1279. }
  1280. rr.Rdata = s
  1281. return nil
  1282. }
  1283. func (rr *SPF) parse(c *zlexer, o string) *ParseError {
  1284. s, e := endingToTxtSlice(c, "bad SPF Txt")
  1285. if e != nil {
  1286. return e
  1287. }
  1288. rr.Txt = s
  1289. return nil
  1290. }
  1291. func (rr *AVC) parse(c *zlexer, o string) *ParseError {
  1292. s, e := endingToTxtSlice(c, "bad AVC Txt")
  1293. if e != nil {
  1294. return e
  1295. }
  1296. rr.Txt = s
  1297. return nil
  1298. }
  1299. func (rr *TXT) parse(c *zlexer, o string) *ParseError {
  1300. // no zBlank reading here, because all this rdata is TXT
  1301. s, e := endingToTxtSlice(c, "bad TXT Txt")
  1302. if e != nil {
  1303. return e
  1304. }
  1305. rr.Txt = s
  1306. return nil
  1307. }
  1308. // identical to setTXT
  1309. func (rr *NINFO) parse(c *zlexer, o string) *ParseError {
  1310. s, e := endingToTxtSlice(c, "bad NINFO ZSData")
  1311. if e != nil {
  1312. return e
  1313. }
  1314. rr.ZSData = s
  1315. return nil
  1316. }
  1317. func (rr *URI) parse(c *zlexer, o string) *ParseError {
  1318. l, _ := c.Next()
  1319. i, e := strconv.ParseUint(l.token, 10, 16)
  1320. if e != nil || l.err {
  1321. return &ParseError{"", "bad URI Priority", l}
  1322. }
  1323. rr.Priority = uint16(i)
  1324. c.Next() // zBlank
  1325. l, _ = c.Next()
  1326. i, e1 := strconv.ParseUint(l.token, 10, 16)
  1327. if e1 != nil || l.err {
  1328. return &ParseError{"", "bad URI Weight", l}
  1329. }
  1330. rr.Weight = uint16(i)
  1331. c.Next() // zBlank
  1332. s, e2 := endingToTxtSlice(c, "bad URI Target")
  1333. if e2 != nil {
  1334. return e2
  1335. }
  1336. if len(s) != 1 {
  1337. return &ParseError{"", "bad URI Target", l}
  1338. }
  1339. rr.Target = s[0]
  1340. return nil
  1341. }
  1342. func (rr *DHCID) parse(c *zlexer, o string) *ParseError {
  1343. // awesome record to parse!
  1344. s, e := endingToString(c, "bad DHCID Digest")
  1345. if e != nil {
  1346. return e
  1347. }
  1348. rr.Digest = s
  1349. return nil
  1350. }
  1351. func (rr *NID) parse(c *zlexer, o string) *ParseError {
  1352. l, _ := c.Next()
  1353. i, e := strconv.ParseUint(l.token, 10, 16)
  1354. if e != nil || l.err {
  1355. return &ParseError{"", "bad NID Preference", l}
  1356. }
  1357. rr.Preference = uint16(i)
  1358. c.Next() // zBlank
  1359. l, _ = c.Next() // zString
  1360. u, e1 := stringToNodeID(l)
  1361. if e1 != nil || l.err {
  1362. return e1
  1363. }
  1364. rr.NodeID = u
  1365. return slurpRemainder(c)
  1366. }
  1367. func (rr *L32) parse(c *zlexer, o string) *ParseError {
  1368. l, _ := c.Next()
  1369. i, e := strconv.ParseUint(l.token, 10, 16)
  1370. if e != nil || l.err {
  1371. return &ParseError{"", "bad L32 Preference", l}
  1372. }
  1373. rr.Preference = uint16(i)
  1374. c.Next() // zBlank
  1375. l, _ = c.Next() // zString
  1376. rr.Locator32 = net.ParseIP(l.token)
  1377. if rr.Locator32 == nil || l.err {
  1378. return &ParseError{"", "bad L32 Locator", l}
  1379. }
  1380. return slurpRemainder(c)
  1381. }
  1382. func (rr *LP) parse(c *zlexer, o string) *ParseError {
  1383. l, _ := c.Next()
  1384. i, e := strconv.ParseUint(l.token, 10, 16)
  1385. if e != nil || l.err {
  1386. return &ParseError{"", "bad LP Preference", l}
  1387. }
  1388. rr.Preference = uint16(i)
  1389. c.Next() // zBlank
  1390. l, _ = c.Next() // zString
  1391. rr.Fqdn = l.token
  1392. name, nameOk := toAbsoluteName(l.token, o)
  1393. if l.err || !nameOk {
  1394. return &ParseError{"", "bad LP Fqdn", l}
  1395. }
  1396. rr.Fqdn = name
  1397. return slurpRemainder(c)
  1398. }
  1399. func (rr *L64) parse(c *zlexer, o string) *ParseError {
  1400. l, _ := c.Next()
  1401. i, e := strconv.ParseUint(l.token, 10, 16)
  1402. if e != nil || l.err {
  1403. return &ParseError{"", "bad L64 Preference", l}
  1404. }
  1405. rr.Preference = uint16(i)
  1406. c.Next() // zBlank
  1407. l, _ = c.Next() // zString
  1408. u, e1 := stringToNodeID(l)
  1409. if e1 != nil || l.err {
  1410. return e1
  1411. }
  1412. rr.Locator64 = u
  1413. return slurpRemainder(c)
  1414. }
  1415. func (rr *UID) parse(c *zlexer, o string) *ParseError {
  1416. l, _ := c.Next()
  1417. i, e := strconv.ParseUint(l.token, 10, 32)
  1418. if e != nil || l.err {
  1419. return &ParseError{"", "bad UID Uid", l}
  1420. }
  1421. rr.Uid = uint32(i)
  1422. return slurpRemainder(c)
  1423. }
  1424. func (rr *GID) parse(c *zlexer, o string) *ParseError {
  1425. l, _ := c.Next()
  1426. i, e := strconv.ParseUint(l.token, 10, 32)
  1427. if e != nil || l.err {
  1428. return &ParseError{"", "bad GID Gid", l}
  1429. }
  1430. rr.Gid = uint32(i)
  1431. return slurpRemainder(c)
  1432. }
  1433. func (rr *UINFO) parse(c *zlexer, o string) *ParseError {
  1434. s, e := endingToTxtSlice(c, "bad UINFO Uinfo")
  1435. if e != nil {
  1436. return e
  1437. }
  1438. if ln := len(s); ln == 0 {
  1439. return nil
  1440. }
  1441. rr.Uinfo = s[0] // silently discard anything after the first character-string
  1442. return nil
  1443. }
  1444. func (rr *PX) parse(c *zlexer, o string) *ParseError {
  1445. l, _ := c.Next()
  1446. i, e := strconv.ParseUint(l.token, 10, 16)
  1447. if e != nil || l.err {
  1448. return &ParseError{"", "bad PX Preference", l}
  1449. }
  1450. rr.Preference = uint16(i)
  1451. c.Next() // zBlank
  1452. l, _ = c.Next() // zString
  1453. rr.Map822 = l.token
  1454. map822, map822Ok := toAbsoluteName(l.token, o)
  1455. if l.err || !map822Ok {
  1456. return &ParseError{"", "bad PX Map822", l}
  1457. }
  1458. rr.Map822 = map822
  1459. c.Next() // zBlank
  1460. l, _ = c.Next() // zString
  1461. rr.Mapx400 = l.token
  1462. mapx400, mapx400Ok := toAbsoluteName(l.token, o)
  1463. if l.err || !mapx400Ok {
  1464. return &ParseError{"", "bad PX Mapx400", l}
  1465. }
  1466. rr.Mapx400 = mapx400
  1467. return slurpRemainder(c)
  1468. }
  1469. func (rr *CAA) parse(c *zlexer, o string) *ParseError {
  1470. l, _ := c.Next()
  1471. i, e := strconv.ParseUint(l.token, 10, 8)
  1472. if e != nil || l.err {
  1473. return &ParseError{"", "bad CAA Flag", l}
  1474. }
  1475. rr.Flag = uint8(i)
  1476. c.Next() // zBlank
  1477. l, _ = c.Next() // zString
  1478. if l.value != zString {
  1479. return &ParseError{"", "bad CAA Tag", l}
  1480. }
  1481. rr.Tag = l.token
  1482. c.Next() // zBlank
  1483. s, e1 := endingToTxtSlice(c, "bad CAA Value")
  1484. if e1 != nil {
  1485. return e1
  1486. }
  1487. if len(s) != 1 {
  1488. return &ParseError{"", "bad CAA Value", l}
  1489. }
  1490. rr.Value = s[0]
  1491. return nil
  1492. }
  1493. func (rr *TKEY) parse(c *zlexer, o string) *ParseError {
  1494. l, _ := c.Next()
  1495. // Algorithm
  1496. if l.value != zString {
  1497. return &ParseError{"", "bad TKEY algorithm", l}
  1498. }
  1499. rr.Algorithm = l.token
  1500. c.Next() // zBlank
  1501. // Get the key length and key values
  1502. l, _ = c.Next()
  1503. i, e := strconv.ParseUint(l.token, 10, 8)
  1504. if e != nil || l.err {
  1505. return &ParseError{"", "bad TKEY key length", l}
  1506. }
  1507. rr.KeySize = uint16(i)
  1508. c.Next() // zBlank
  1509. l, _ = c.Next()
  1510. if l.value != zString {
  1511. return &ParseError{"", "bad TKEY key", l}
  1512. }
  1513. rr.Key = l.token
  1514. c.Next() // zBlank
  1515. // Get the otherdata length and string data
  1516. l, _ = c.Next()
  1517. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1518. if e1 != nil || l.err {
  1519. return &ParseError{"", "bad TKEY otherdata length", l}
  1520. }
  1521. rr.OtherLen = uint16(i)
  1522. c.Next() // zBlank
  1523. l, _ = c.Next()
  1524. if l.value != zString {
  1525. return &ParseError{"", "bad TKEY otherday", l}
  1526. }
  1527. rr.OtherData = l.token
  1528. return nil
  1529. }
  1530. func (rr *APL) parse(c *zlexer, o string) *ParseError {
  1531. var prefixes []APLPrefix
  1532. for {
  1533. l, _ := c.Next()
  1534. if l.value == zNewline || l.value == zEOF {
  1535. break
  1536. }
  1537. if l.value == zBlank && prefixes != nil {
  1538. continue
  1539. }
  1540. if l.value != zString {
  1541. return &ParseError{"", "unexpected APL field", l}
  1542. }
  1543. // Expected format: [!]afi:address/prefix
  1544. colon := strings.IndexByte(l.token, ':')
  1545. if colon == -1 {
  1546. return &ParseError{"", "missing colon in APL field", l}
  1547. }
  1548. family, cidr := l.token[:colon], l.token[colon+1:]
  1549. var negation bool
  1550. if family != "" && family[0] == '!' {
  1551. negation = true
  1552. family = family[1:]
  1553. }
  1554. afi, e := strconv.ParseUint(family, 10, 16)
  1555. if e != nil {
  1556. return &ParseError{"", "failed to parse APL family: " + e.Error(), l}
  1557. }
  1558. var addrLen int
  1559. switch afi {
  1560. case 1:
  1561. addrLen = net.IPv4len
  1562. case 2:
  1563. addrLen = net.IPv6len
  1564. default:
  1565. return &ParseError{"", "unrecognized APL family", l}
  1566. }
  1567. ip, subnet, e1 := net.ParseCIDR(cidr)
  1568. if e1 != nil {
  1569. return &ParseError{"", "failed to parse APL address: " + e1.Error(), l}
  1570. }
  1571. if !ip.Equal(subnet.IP) {
  1572. return &ParseError{"", "extra bits in APL address", l}
  1573. }
  1574. if len(subnet.IP) != addrLen {
  1575. return &ParseError{"", "address mismatch with the APL family", l}
  1576. }
  1577. prefixes = append(prefixes, APLPrefix{
  1578. Negation: negation,
  1579. Network: *subnet,
  1580. })
  1581. }
  1582. rr.Prefixes = prefixes
  1583. return nil
  1584. }