scan_rr.go 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778
  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 || i > 90 {
  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 || i > 59 {
  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, 64); err != nil || l.err || i < 0 || i >= 60 {
  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 || i > 180 {
  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 || i > 59 {
  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, 64); err != nil || l.err || i < 0 || i >= 60 {
  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 l.token == "" || 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, 64); 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 l.token == "" || 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 l.token == "" || l.err {
  654. return &ParseError{"", "bad HIP PublicKey", l}
  655. }
  656. rr.PublicKey = l.token // This cannot contain spaces
  657. decodedPK, decodedPKerr := base64.StdEncoding.DecodeString(rr.PublicKey)
  658. if decodedPKerr != nil {
  659. return &ParseError{"", "bad HIP PublicKey", l}
  660. }
  661. rr.PublicKeyLength = uint16(len(decodedPK))
  662. // RendezvousServers (if any)
  663. l, _ = c.Next()
  664. var xs []string
  665. for l.value != zNewline && l.value != zEOF {
  666. switch l.value {
  667. case zString:
  668. name, nameOk := toAbsoluteName(l.token, o)
  669. if l.err || !nameOk {
  670. return &ParseError{"", "bad HIP RendezvousServers", l}
  671. }
  672. xs = append(xs, name)
  673. case zBlank:
  674. // Ok
  675. default:
  676. return &ParseError{"", "bad HIP RendezvousServers", l}
  677. }
  678. l, _ = c.Next()
  679. }
  680. rr.RendezvousServers = xs
  681. return nil
  682. }
  683. func (rr *CERT) parse(c *zlexer, o string) *ParseError {
  684. l, _ := c.Next()
  685. if v, ok := StringToCertType[l.token]; ok {
  686. rr.Type = v
  687. } else if i, err := strconv.ParseUint(l.token, 10, 16); err != nil {
  688. return &ParseError{"", "bad CERT Type", l}
  689. } else {
  690. rr.Type = uint16(i)
  691. }
  692. c.Next() // zBlank
  693. l, _ = c.Next() // zString
  694. i, e := strconv.ParseUint(l.token, 10, 16)
  695. if e != nil || l.err {
  696. return &ParseError{"", "bad CERT KeyTag", l}
  697. }
  698. rr.KeyTag = uint16(i)
  699. c.Next() // zBlank
  700. l, _ = c.Next() // zString
  701. if v, ok := StringToAlgorithm[l.token]; ok {
  702. rr.Algorithm = v
  703. } else if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  704. return &ParseError{"", "bad CERT Algorithm", l}
  705. } else {
  706. rr.Algorithm = uint8(i)
  707. }
  708. s, e1 := endingToString(c, "bad CERT Certificate")
  709. if e1 != nil {
  710. return e1
  711. }
  712. rr.Certificate = s
  713. return nil
  714. }
  715. func (rr *OPENPGPKEY) parse(c *zlexer, o string) *ParseError {
  716. s, e := endingToString(c, "bad OPENPGPKEY PublicKey")
  717. if e != nil {
  718. return e
  719. }
  720. rr.PublicKey = s
  721. return nil
  722. }
  723. func (rr *CSYNC) parse(c *zlexer, o string) *ParseError {
  724. l, _ := c.Next()
  725. j, e := strconv.ParseUint(l.token, 10, 32)
  726. if e != nil {
  727. // Serial must be a number
  728. return &ParseError{"", "bad CSYNC serial", l}
  729. }
  730. rr.Serial = uint32(j)
  731. c.Next() // zBlank
  732. l, _ = c.Next()
  733. j, e1 := strconv.ParseUint(l.token, 10, 16)
  734. if e1 != nil {
  735. // Serial must be a number
  736. return &ParseError{"", "bad CSYNC flags", l}
  737. }
  738. rr.Flags = uint16(j)
  739. rr.TypeBitMap = make([]uint16, 0)
  740. var (
  741. k uint16
  742. ok bool
  743. )
  744. l, _ = c.Next()
  745. for l.value != zNewline && l.value != zEOF {
  746. switch l.value {
  747. case zBlank:
  748. // Ok
  749. case zString:
  750. tokenUpper := strings.ToUpper(l.token)
  751. if k, ok = StringToType[tokenUpper]; !ok {
  752. if k, ok = typeToInt(l.token); !ok {
  753. return &ParseError{"", "bad CSYNC TypeBitMap", l}
  754. }
  755. }
  756. rr.TypeBitMap = append(rr.TypeBitMap, k)
  757. default:
  758. return &ParseError{"", "bad CSYNC TypeBitMap", l}
  759. }
  760. l, _ = c.Next()
  761. }
  762. return nil
  763. }
  764. func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError {
  765. l, _ := c.Next()
  766. i, e := strconv.ParseUint(l.token, 10, 32)
  767. if e != nil || l.err {
  768. return &ParseError{"", "bad ZONEMD Serial", l}
  769. }
  770. rr.Serial = uint32(i)
  771. c.Next() // zBlank
  772. l, _ = c.Next()
  773. i, e1 := strconv.ParseUint(l.token, 10, 8)
  774. if e1 != nil || l.err {
  775. return &ParseError{"", "bad ZONEMD Scheme", l}
  776. }
  777. rr.Scheme = uint8(i)
  778. c.Next() // zBlank
  779. l, _ = c.Next()
  780. i, err := strconv.ParseUint(l.token, 10, 8)
  781. if err != nil || l.err {
  782. return &ParseError{"", "bad ZONEMD Hash Algorithm", l}
  783. }
  784. rr.Hash = uint8(i)
  785. s, e2 := endingToString(c, "bad ZONEMD Digest")
  786. if e2 != nil {
  787. return e2
  788. }
  789. rr.Digest = s
  790. return nil
  791. }
  792. func (rr *SIG) parse(c *zlexer, o string) *ParseError { return rr.RRSIG.parse(c, o) }
  793. func (rr *RRSIG) parse(c *zlexer, o string) *ParseError {
  794. l, _ := c.Next()
  795. tokenUpper := strings.ToUpper(l.token)
  796. if t, ok := StringToType[tokenUpper]; !ok {
  797. if strings.HasPrefix(tokenUpper, "TYPE") {
  798. t, ok = typeToInt(l.token)
  799. if !ok {
  800. return &ParseError{"", "bad RRSIG Typecovered", l}
  801. }
  802. rr.TypeCovered = t
  803. } else {
  804. return &ParseError{"", "bad RRSIG Typecovered", l}
  805. }
  806. } else {
  807. rr.TypeCovered = t
  808. }
  809. c.Next() // zBlank
  810. l, _ = c.Next()
  811. i, e := strconv.ParseUint(l.token, 10, 8)
  812. if e != nil || l.err {
  813. return &ParseError{"", "bad RRSIG Algorithm", l}
  814. }
  815. rr.Algorithm = uint8(i)
  816. c.Next() // zBlank
  817. l, _ = c.Next()
  818. i, e1 := strconv.ParseUint(l.token, 10, 8)
  819. if e1 != nil || l.err {
  820. return &ParseError{"", "bad RRSIG Labels", l}
  821. }
  822. rr.Labels = uint8(i)
  823. c.Next() // zBlank
  824. l, _ = c.Next()
  825. i, e2 := strconv.ParseUint(l.token, 10, 32)
  826. if e2 != nil || l.err {
  827. return &ParseError{"", "bad RRSIG OrigTtl", l}
  828. }
  829. rr.OrigTtl = uint32(i)
  830. c.Next() // zBlank
  831. l, _ = c.Next()
  832. if i, err := StringToTime(l.token); err != nil {
  833. // Try to see if all numeric and use it as epoch
  834. if i, err := strconv.ParseUint(l.token, 10, 32); err == nil {
  835. rr.Expiration = uint32(i)
  836. } else {
  837. return &ParseError{"", "bad RRSIG Expiration", l}
  838. }
  839. } else {
  840. rr.Expiration = i
  841. }
  842. c.Next() // zBlank
  843. l, _ = c.Next()
  844. if i, err := StringToTime(l.token); err != nil {
  845. if i, err := strconv.ParseUint(l.token, 10, 32); err == nil {
  846. rr.Inception = uint32(i)
  847. } else {
  848. return &ParseError{"", "bad RRSIG Inception", l}
  849. }
  850. } else {
  851. rr.Inception = i
  852. }
  853. c.Next() // zBlank
  854. l, _ = c.Next()
  855. i, e3 := strconv.ParseUint(l.token, 10, 16)
  856. if e3 != nil || l.err {
  857. return &ParseError{"", "bad RRSIG KeyTag", l}
  858. }
  859. rr.KeyTag = uint16(i)
  860. c.Next() // zBlank
  861. l, _ = c.Next()
  862. rr.SignerName = l.token
  863. name, nameOk := toAbsoluteName(l.token, o)
  864. if l.err || !nameOk {
  865. return &ParseError{"", "bad RRSIG SignerName", l}
  866. }
  867. rr.SignerName = name
  868. s, e4 := endingToString(c, "bad RRSIG Signature")
  869. if e4 != nil {
  870. return e4
  871. }
  872. rr.Signature = s
  873. return nil
  874. }
  875. func (rr *NSEC) parse(c *zlexer, o string) *ParseError {
  876. l, _ := c.Next()
  877. name, nameOk := toAbsoluteName(l.token, o)
  878. if l.err || !nameOk {
  879. return &ParseError{"", "bad NSEC NextDomain", l}
  880. }
  881. rr.NextDomain = name
  882. rr.TypeBitMap = make([]uint16, 0)
  883. var (
  884. k uint16
  885. ok bool
  886. )
  887. l, _ = c.Next()
  888. for l.value != zNewline && l.value != zEOF {
  889. switch l.value {
  890. case zBlank:
  891. // Ok
  892. case zString:
  893. tokenUpper := strings.ToUpper(l.token)
  894. if k, ok = StringToType[tokenUpper]; !ok {
  895. if k, ok = typeToInt(l.token); !ok {
  896. return &ParseError{"", "bad NSEC TypeBitMap", l}
  897. }
  898. }
  899. rr.TypeBitMap = append(rr.TypeBitMap, k)
  900. default:
  901. return &ParseError{"", "bad NSEC TypeBitMap", l}
  902. }
  903. l, _ = c.Next()
  904. }
  905. return nil
  906. }
  907. func (rr *NSEC3) parse(c *zlexer, o string) *ParseError {
  908. l, _ := c.Next()
  909. i, e := strconv.ParseUint(l.token, 10, 8)
  910. if e != nil || l.err {
  911. return &ParseError{"", "bad NSEC3 Hash", l}
  912. }
  913. rr.Hash = uint8(i)
  914. c.Next() // zBlank
  915. l, _ = c.Next()
  916. i, e1 := strconv.ParseUint(l.token, 10, 8)
  917. if e1 != nil || l.err {
  918. return &ParseError{"", "bad NSEC3 Flags", l}
  919. }
  920. rr.Flags = uint8(i)
  921. c.Next() // zBlank
  922. l, _ = c.Next()
  923. i, e2 := strconv.ParseUint(l.token, 10, 16)
  924. if e2 != nil || l.err {
  925. return &ParseError{"", "bad NSEC3 Iterations", l}
  926. }
  927. rr.Iterations = uint16(i)
  928. c.Next()
  929. l, _ = c.Next()
  930. if l.token == "" || l.err {
  931. return &ParseError{"", "bad NSEC3 Salt", l}
  932. }
  933. if l.token != "-" {
  934. rr.SaltLength = uint8(len(l.token)) / 2
  935. rr.Salt = l.token
  936. }
  937. c.Next()
  938. l, _ = c.Next()
  939. if l.token == "" || l.err {
  940. return &ParseError{"", "bad NSEC3 NextDomain", l}
  941. }
  942. rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits)
  943. rr.NextDomain = l.token
  944. rr.TypeBitMap = make([]uint16, 0)
  945. var (
  946. k uint16
  947. ok bool
  948. )
  949. l, _ = c.Next()
  950. for l.value != zNewline && l.value != zEOF {
  951. switch l.value {
  952. case zBlank:
  953. // Ok
  954. case zString:
  955. tokenUpper := strings.ToUpper(l.token)
  956. if k, ok = StringToType[tokenUpper]; !ok {
  957. if k, ok = typeToInt(l.token); !ok {
  958. return &ParseError{"", "bad NSEC3 TypeBitMap", l}
  959. }
  960. }
  961. rr.TypeBitMap = append(rr.TypeBitMap, k)
  962. default:
  963. return &ParseError{"", "bad NSEC3 TypeBitMap", l}
  964. }
  965. l, _ = c.Next()
  966. }
  967. return nil
  968. }
  969. func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError {
  970. l, _ := c.Next()
  971. i, e := strconv.ParseUint(l.token, 10, 8)
  972. if e != nil || l.err {
  973. return &ParseError{"", "bad NSEC3PARAM Hash", l}
  974. }
  975. rr.Hash = uint8(i)
  976. c.Next() // zBlank
  977. l, _ = c.Next()
  978. i, e1 := strconv.ParseUint(l.token, 10, 8)
  979. if e1 != nil || l.err {
  980. return &ParseError{"", "bad NSEC3PARAM Flags", l}
  981. }
  982. rr.Flags = uint8(i)
  983. c.Next() // zBlank
  984. l, _ = c.Next()
  985. i, e2 := strconv.ParseUint(l.token, 10, 16)
  986. if e2 != nil || l.err {
  987. return &ParseError{"", "bad NSEC3PARAM Iterations", l}
  988. }
  989. rr.Iterations = uint16(i)
  990. c.Next()
  991. l, _ = c.Next()
  992. if l.token != "-" {
  993. rr.SaltLength = uint8(len(l.token) / 2)
  994. rr.Salt = l.token
  995. }
  996. return slurpRemainder(c)
  997. }
  998. func (rr *EUI48) parse(c *zlexer, o string) *ParseError {
  999. l, _ := c.Next()
  1000. if len(l.token) != 17 || l.err {
  1001. return &ParseError{"", "bad EUI48 Address", l}
  1002. }
  1003. addr := make([]byte, 12)
  1004. dash := 0
  1005. for i := 0; i < 10; i += 2 {
  1006. addr[i] = l.token[i+dash]
  1007. addr[i+1] = l.token[i+1+dash]
  1008. dash++
  1009. if l.token[i+1+dash] != '-' {
  1010. return &ParseError{"", "bad EUI48 Address", l}
  1011. }
  1012. }
  1013. addr[10] = l.token[15]
  1014. addr[11] = l.token[16]
  1015. i, e := strconv.ParseUint(string(addr), 16, 48)
  1016. if e != nil {
  1017. return &ParseError{"", "bad EUI48 Address", l}
  1018. }
  1019. rr.Address = i
  1020. return slurpRemainder(c)
  1021. }
  1022. func (rr *EUI64) parse(c *zlexer, o string) *ParseError {
  1023. l, _ := c.Next()
  1024. if len(l.token) != 23 || l.err {
  1025. return &ParseError{"", "bad EUI64 Address", l}
  1026. }
  1027. addr := make([]byte, 16)
  1028. dash := 0
  1029. for i := 0; i < 14; i += 2 {
  1030. addr[i] = l.token[i+dash]
  1031. addr[i+1] = l.token[i+1+dash]
  1032. dash++
  1033. if l.token[i+1+dash] != '-' {
  1034. return &ParseError{"", "bad EUI64 Address", l}
  1035. }
  1036. }
  1037. addr[14] = l.token[21]
  1038. addr[15] = l.token[22]
  1039. i, e := strconv.ParseUint(string(addr), 16, 64)
  1040. if e != nil {
  1041. return &ParseError{"", "bad EUI68 Address", l}
  1042. }
  1043. rr.Address = i
  1044. return slurpRemainder(c)
  1045. }
  1046. func (rr *SSHFP) parse(c *zlexer, o string) *ParseError {
  1047. l, _ := c.Next()
  1048. i, e := strconv.ParseUint(l.token, 10, 8)
  1049. if e != nil || l.err {
  1050. return &ParseError{"", "bad SSHFP Algorithm", l}
  1051. }
  1052. rr.Algorithm = uint8(i)
  1053. c.Next() // zBlank
  1054. l, _ = c.Next()
  1055. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1056. if e1 != nil || l.err {
  1057. return &ParseError{"", "bad SSHFP Type", l}
  1058. }
  1059. rr.Type = uint8(i)
  1060. c.Next() // zBlank
  1061. s, e2 := endingToString(c, "bad SSHFP Fingerprint")
  1062. if e2 != nil {
  1063. return e2
  1064. }
  1065. rr.FingerPrint = s
  1066. return nil
  1067. }
  1068. func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError {
  1069. l, _ := c.Next()
  1070. i, e := strconv.ParseUint(l.token, 10, 16)
  1071. if e != nil || l.err {
  1072. return &ParseError{"", "bad " + typ + " Flags", l}
  1073. }
  1074. rr.Flags = uint16(i)
  1075. c.Next() // zBlank
  1076. l, _ = c.Next() // zString
  1077. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1078. if e1 != nil || l.err {
  1079. return &ParseError{"", "bad " + typ + " Protocol", l}
  1080. }
  1081. rr.Protocol = uint8(i)
  1082. c.Next() // zBlank
  1083. l, _ = c.Next() // zString
  1084. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1085. if e2 != nil || l.err {
  1086. return &ParseError{"", "bad " + typ + " Algorithm", l}
  1087. }
  1088. rr.Algorithm = uint8(i)
  1089. s, e3 := endingToString(c, "bad "+typ+" PublicKey")
  1090. if e3 != nil {
  1091. return e3
  1092. }
  1093. rr.PublicKey = s
  1094. return nil
  1095. }
  1096. func (rr *DNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "DNSKEY") }
  1097. func (rr *KEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "KEY") }
  1098. func (rr *CDNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "CDNSKEY") }
  1099. func (rr *DS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DS") }
  1100. func (rr *DLV) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DLV") }
  1101. func (rr *CDS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "CDS") }
  1102. func (rr *RKEY) parse(c *zlexer, o string) *ParseError {
  1103. l, _ := c.Next()
  1104. i, e := strconv.ParseUint(l.token, 10, 16)
  1105. if e != nil || l.err {
  1106. return &ParseError{"", "bad RKEY Flags", l}
  1107. }
  1108. rr.Flags = uint16(i)
  1109. c.Next() // zBlank
  1110. l, _ = c.Next() // zString
  1111. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1112. if e1 != nil || l.err {
  1113. return &ParseError{"", "bad RKEY Protocol", l}
  1114. }
  1115. rr.Protocol = uint8(i)
  1116. c.Next() // zBlank
  1117. l, _ = c.Next() // zString
  1118. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1119. if e2 != nil || l.err {
  1120. return &ParseError{"", "bad RKEY Algorithm", l}
  1121. }
  1122. rr.Algorithm = uint8(i)
  1123. s, e3 := endingToString(c, "bad RKEY PublicKey")
  1124. if e3 != nil {
  1125. return e3
  1126. }
  1127. rr.PublicKey = s
  1128. return nil
  1129. }
  1130. func (rr *EID) parse(c *zlexer, o string) *ParseError {
  1131. s, e := endingToString(c, "bad EID Endpoint")
  1132. if e != nil {
  1133. return e
  1134. }
  1135. rr.Endpoint = s
  1136. return nil
  1137. }
  1138. func (rr *NIMLOC) parse(c *zlexer, o string) *ParseError {
  1139. s, e := endingToString(c, "bad NIMLOC Locator")
  1140. if e != nil {
  1141. return e
  1142. }
  1143. rr.Locator = s
  1144. return nil
  1145. }
  1146. func (rr *GPOS) parse(c *zlexer, o string) *ParseError {
  1147. l, _ := c.Next()
  1148. _, e := strconv.ParseFloat(l.token, 64)
  1149. if e != nil || l.err {
  1150. return &ParseError{"", "bad GPOS Longitude", l}
  1151. }
  1152. rr.Longitude = l.token
  1153. c.Next() // zBlank
  1154. l, _ = c.Next()
  1155. _, e1 := strconv.ParseFloat(l.token, 64)
  1156. if e1 != nil || l.err {
  1157. return &ParseError{"", "bad GPOS Latitude", l}
  1158. }
  1159. rr.Latitude = l.token
  1160. c.Next() // zBlank
  1161. l, _ = c.Next()
  1162. _, e2 := strconv.ParseFloat(l.token, 64)
  1163. if e2 != nil || l.err {
  1164. return &ParseError{"", "bad GPOS Altitude", l}
  1165. }
  1166. rr.Altitude = l.token
  1167. return slurpRemainder(c)
  1168. }
  1169. func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError {
  1170. l, _ := c.Next()
  1171. i, e := strconv.ParseUint(l.token, 10, 16)
  1172. if e != nil || l.err {
  1173. return &ParseError{"", "bad " + typ + " KeyTag", l}
  1174. }
  1175. rr.KeyTag = uint16(i)
  1176. c.Next() // zBlank
  1177. l, _ = c.Next()
  1178. if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  1179. tokenUpper := strings.ToUpper(l.token)
  1180. i, ok := StringToAlgorithm[tokenUpper]
  1181. if !ok || l.err {
  1182. return &ParseError{"", "bad " + typ + " Algorithm", l}
  1183. }
  1184. rr.Algorithm = i
  1185. } else {
  1186. rr.Algorithm = uint8(i)
  1187. }
  1188. c.Next() // zBlank
  1189. l, _ = c.Next()
  1190. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1191. if e1 != nil || l.err {
  1192. return &ParseError{"", "bad " + typ + " DigestType", l}
  1193. }
  1194. rr.DigestType = uint8(i)
  1195. s, e2 := endingToString(c, "bad "+typ+" Digest")
  1196. if e2 != nil {
  1197. return e2
  1198. }
  1199. rr.Digest = s
  1200. return nil
  1201. }
  1202. func (rr *TA) parse(c *zlexer, o string) *ParseError {
  1203. l, _ := c.Next()
  1204. i, e := strconv.ParseUint(l.token, 10, 16)
  1205. if e != nil || l.err {
  1206. return &ParseError{"", "bad TA KeyTag", l}
  1207. }
  1208. rr.KeyTag = uint16(i)
  1209. c.Next() // zBlank
  1210. l, _ = c.Next()
  1211. if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  1212. tokenUpper := strings.ToUpper(l.token)
  1213. i, ok := StringToAlgorithm[tokenUpper]
  1214. if !ok || l.err {
  1215. return &ParseError{"", "bad TA Algorithm", l}
  1216. }
  1217. rr.Algorithm = i
  1218. } else {
  1219. rr.Algorithm = uint8(i)
  1220. }
  1221. c.Next() // zBlank
  1222. l, _ = c.Next()
  1223. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1224. if e1 != nil || l.err {
  1225. return &ParseError{"", "bad TA DigestType", l}
  1226. }
  1227. rr.DigestType = uint8(i)
  1228. s, e2 := endingToString(c, "bad TA Digest")
  1229. if e2 != nil {
  1230. return e2
  1231. }
  1232. rr.Digest = s
  1233. return nil
  1234. }
  1235. func (rr *TLSA) parse(c *zlexer, o string) *ParseError {
  1236. l, _ := c.Next()
  1237. i, e := strconv.ParseUint(l.token, 10, 8)
  1238. if e != nil || l.err {
  1239. return &ParseError{"", "bad TLSA Usage", l}
  1240. }
  1241. rr.Usage = uint8(i)
  1242. c.Next() // zBlank
  1243. l, _ = c.Next()
  1244. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1245. if e1 != nil || l.err {
  1246. return &ParseError{"", "bad TLSA Selector", l}
  1247. }
  1248. rr.Selector = uint8(i)
  1249. c.Next() // zBlank
  1250. l, _ = c.Next()
  1251. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1252. if e2 != nil || l.err {
  1253. return &ParseError{"", "bad TLSA MatchingType", l}
  1254. }
  1255. rr.MatchingType = uint8(i)
  1256. // So this needs be e2 (i.e. different than e), because...??t
  1257. s, e3 := endingToString(c, "bad TLSA Certificate")
  1258. if e3 != nil {
  1259. return e3
  1260. }
  1261. rr.Certificate = s
  1262. return nil
  1263. }
  1264. func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError {
  1265. l, _ := c.Next()
  1266. i, e := strconv.ParseUint(l.token, 10, 8)
  1267. if e != nil || l.err {
  1268. return &ParseError{"", "bad SMIMEA Usage", l}
  1269. }
  1270. rr.Usage = uint8(i)
  1271. c.Next() // zBlank
  1272. l, _ = c.Next()
  1273. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1274. if e1 != nil || l.err {
  1275. return &ParseError{"", "bad SMIMEA Selector", l}
  1276. }
  1277. rr.Selector = uint8(i)
  1278. c.Next() // zBlank
  1279. l, _ = c.Next()
  1280. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1281. if e2 != nil || l.err {
  1282. return &ParseError{"", "bad SMIMEA MatchingType", l}
  1283. }
  1284. rr.MatchingType = uint8(i)
  1285. // So this needs be e2 (i.e. different than e), because...??t
  1286. s, e3 := endingToString(c, "bad SMIMEA Certificate")
  1287. if e3 != nil {
  1288. return e3
  1289. }
  1290. rr.Certificate = s
  1291. return nil
  1292. }
  1293. func (rr *RFC3597) parse(c *zlexer, o string) *ParseError {
  1294. l, _ := c.Next()
  1295. if l.token != "\\#" {
  1296. return &ParseError{"", "bad RFC3597 Rdata", l}
  1297. }
  1298. c.Next() // zBlank
  1299. l, _ = c.Next()
  1300. rdlength, e := strconv.ParseUint(l.token, 10, 16)
  1301. if e != nil || l.err {
  1302. return &ParseError{"", "bad RFC3597 Rdata ", l}
  1303. }
  1304. s, e1 := endingToString(c, "bad RFC3597 Rdata")
  1305. if e1 != nil {
  1306. return e1
  1307. }
  1308. if int(rdlength)*2 != len(s) {
  1309. return &ParseError{"", "bad RFC3597 Rdata", l}
  1310. }
  1311. rr.Rdata = s
  1312. return nil
  1313. }
  1314. func (rr *SPF) parse(c *zlexer, o string) *ParseError {
  1315. s, e := endingToTxtSlice(c, "bad SPF Txt")
  1316. if e != nil {
  1317. return e
  1318. }
  1319. rr.Txt = s
  1320. return nil
  1321. }
  1322. func (rr *AVC) parse(c *zlexer, o string) *ParseError {
  1323. s, e := endingToTxtSlice(c, "bad AVC Txt")
  1324. if e != nil {
  1325. return e
  1326. }
  1327. rr.Txt = s
  1328. return nil
  1329. }
  1330. func (rr *TXT) parse(c *zlexer, o string) *ParseError {
  1331. // no zBlank reading here, because all this rdata is TXT
  1332. s, e := endingToTxtSlice(c, "bad TXT Txt")
  1333. if e != nil {
  1334. return e
  1335. }
  1336. rr.Txt = s
  1337. return nil
  1338. }
  1339. // identical to setTXT
  1340. func (rr *NINFO) parse(c *zlexer, o string) *ParseError {
  1341. s, e := endingToTxtSlice(c, "bad NINFO ZSData")
  1342. if e != nil {
  1343. return e
  1344. }
  1345. rr.ZSData = s
  1346. return nil
  1347. }
  1348. func (rr *URI) parse(c *zlexer, o string) *ParseError {
  1349. l, _ := c.Next()
  1350. i, e := strconv.ParseUint(l.token, 10, 16)
  1351. if e != nil || l.err {
  1352. return &ParseError{"", "bad URI Priority", l}
  1353. }
  1354. rr.Priority = uint16(i)
  1355. c.Next() // zBlank
  1356. l, _ = c.Next()
  1357. i, e1 := strconv.ParseUint(l.token, 10, 16)
  1358. if e1 != nil || l.err {
  1359. return &ParseError{"", "bad URI Weight", l}
  1360. }
  1361. rr.Weight = uint16(i)
  1362. c.Next() // zBlank
  1363. s, e2 := endingToTxtSlice(c, "bad URI Target")
  1364. if e2 != nil {
  1365. return e2
  1366. }
  1367. if len(s) != 1 {
  1368. return &ParseError{"", "bad URI Target", l}
  1369. }
  1370. rr.Target = s[0]
  1371. return nil
  1372. }
  1373. func (rr *DHCID) parse(c *zlexer, o string) *ParseError {
  1374. // awesome record to parse!
  1375. s, e := endingToString(c, "bad DHCID Digest")
  1376. if e != nil {
  1377. return e
  1378. }
  1379. rr.Digest = s
  1380. return nil
  1381. }
  1382. func (rr *NID) 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 NID Preference", l}
  1387. }
  1388. rr.Preference = uint16(i)
  1389. c.Next() // zBlank
  1390. l, _ = c.Next() // zString
  1391. u, e1 := stringToNodeID(l)
  1392. if e1 != nil || l.err {
  1393. return e1
  1394. }
  1395. rr.NodeID = u
  1396. return slurpRemainder(c)
  1397. }
  1398. func (rr *L32) parse(c *zlexer, o string) *ParseError {
  1399. l, _ := c.Next()
  1400. i, e := strconv.ParseUint(l.token, 10, 16)
  1401. if e != nil || l.err {
  1402. return &ParseError{"", "bad L32 Preference", l}
  1403. }
  1404. rr.Preference = uint16(i)
  1405. c.Next() // zBlank
  1406. l, _ = c.Next() // zString
  1407. rr.Locator32 = net.ParseIP(l.token)
  1408. if rr.Locator32 == nil || l.err {
  1409. return &ParseError{"", "bad L32 Locator", l}
  1410. }
  1411. return slurpRemainder(c)
  1412. }
  1413. func (rr *LP) parse(c *zlexer, o string) *ParseError {
  1414. l, _ := c.Next()
  1415. i, e := strconv.ParseUint(l.token, 10, 16)
  1416. if e != nil || l.err {
  1417. return &ParseError{"", "bad LP Preference", l}
  1418. }
  1419. rr.Preference = uint16(i)
  1420. c.Next() // zBlank
  1421. l, _ = c.Next() // zString
  1422. rr.Fqdn = l.token
  1423. name, nameOk := toAbsoluteName(l.token, o)
  1424. if l.err || !nameOk {
  1425. return &ParseError{"", "bad LP Fqdn", l}
  1426. }
  1427. rr.Fqdn = name
  1428. return slurpRemainder(c)
  1429. }
  1430. func (rr *L64) parse(c *zlexer, o string) *ParseError {
  1431. l, _ := c.Next()
  1432. i, e := strconv.ParseUint(l.token, 10, 16)
  1433. if e != nil || l.err {
  1434. return &ParseError{"", "bad L64 Preference", l}
  1435. }
  1436. rr.Preference = uint16(i)
  1437. c.Next() // zBlank
  1438. l, _ = c.Next() // zString
  1439. u, e1 := stringToNodeID(l)
  1440. if e1 != nil || l.err {
  1441. return e1
  1442. }
  1443. rr.Locator64 = u
  1444. return slurpRemainder(c)
  1445. }
  1446. func (rr *UID) parse(c *zlexer, o string) *ParseError {
  1447. l, _ := c.Next()
  1448. i, e := strconv.ParseUint(l.token, 10, 32)
  1449. if e != nil || l.err {
  1450. return &ParseError{"", "bad UID Uid", l}
  1451. }
  1452. rr.Uid = uint32(i)
  1453. return slurpRemainder(c)
  1454. }
  1455. func (rr *GID) parse(c *zlexer, o string) *ParseError {
  1456. l, _ := c.Next()
  1457. i, e := strconv.ParseUint(l.token, 10, 32)
  1458. if e != nil || l.err {
  1459. return &ParseError{"", "bad GID Gid", l}
  1460. }
  1461. rr.Gid = uint32(i)
  1462. return slurpRemainder(c)
  1463. }
  1464. func (rr *UINFO) parse(c *zlexer, o string) *ParseError {
  1465. s, e := endingToTxtSlice(c, "bad UINFO Uinfo")
  1466. if e != nil {
  1467. return e
  1468. }
  1469. if ln := len(s); ln == 0 {
  1470. return nil
  1471. }
  1472. rr.Uinfo = s[0] // silently discard anything after the first character-string
  1473. return nil
  1474. }
  1475. func (rr *PX) parse(c *zlexer, o string) *ParseError {
  1476. l, _ := c.Next()
  1477. i, e := strconv.ParseUint(l.token, 10, 16)
  1478. if e != nil || l.err {
  1479. return &ParseError{"", "bad PX Preference", l}
  1480. }
  1481. rr.Preference = uint16(i)
  1482. c.Next() // zBlank
  1483. l, _ = c.Next() // zString
  1484. rr.Map822 = l.token
  1485. map822, map822Ok := toAbsoluteName(l.token, o)
  1486. if l.err || !map822Ok {
  1487. return &ParseError{"", "bad PX Map822", l}
  1488. }
  1489. rr.Map822 = map822
  1490. c.Next() // zBlank
  1491. l, _ = c.Next() // zString
  1492. rr.Mapx400 = l.token
  1493. mapx400, mapx400Ok := toAbsoluteName(l.token, o)
  1494. if l.err || !mapx400Ok {
  1495. return &ParseError{"", "bad PX Mapx400", l}
  1496. }
  1497. rr.Mapx400 = mapx400
  1498. return slurpRemainder(c)
  1499. }
  1500. func (rr *CAA) parse(c *zlexer, o string) *ParseError {
  1501. l, _ := c.Next()
  1502. i, e := strconv.ParseUint(l.token, 10, 8)
  1503. if e != nil || l.err {
  1504. return &ParseError{"", "bad CAA Flag", l}
  1505. }
  1506. rr.Flag = uint8(i)
  1507. c.Next() // zBlank
  1508. l, _ = c.Next() // zString
  1509. if l.value != zString {
  1510. return &ParseError{"", "bad CAA Tag", l}
  1511. }
  1512. rr.Tag = l.token
  1513. c.Next() // zBlank
  1514. s, e1 := endingToTxtSlice(c, "bad CAA Value")
  1515. if e1 != nil {
  1516. return e1
  1517. }
  1518. if len(s) != 1 {
  1519. return &ParseError{"", "bad CAA Value", l}
  1520. }
  1521. rr.Value = s[0]
  1522. return nil
  1523. }
  1524. func (rr *TKEY) parse(c *zlexer, o string) *ParseError {
  1525. l, _ := c.Next()
  1526. // Algorithm
  1527. if l.value != zString {
  1528. return &ParseError{"", "bad TKEY algorithm", l}
  1529. }
  1530. rr.Algorithm = l.token
  1531. c.Next() // zBlank
  1532. // Get the key length and key values
  1533. l, _ = c.Next()
  1534. i, e := strconv.ParseUint(l.token, 10, 8)
  1535. if e != nil || l.err {
  1536. return &ParseError{"", "bad TKEY key length", l}
  1537. }
  1538. rr.KeySize = uint16(i)
  1539. c.Next() // zBlank
  1540. l, _ = c.Next()
  1541. if l.value != zString {
  1542. return &ParseError{"", "bad TKEY key", l}
  1543. }
  1544. rr.Key = l.token
  1545. c.Next() // zBlank
  1546. // Get the otherdata length and string data
  1547. l, _ = c.Next()
  1548. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1549. if e1 != nil || l.err {
  1550. return &ParseError{"", "bad TKEY otherdata length", l}
  1551. }
  1552. rr.OtherLen = uint16(i)
  1553. c.Next() // zBlank
  1554. l, _ = c.Next()
  1555. if l.value != zString {
  1556. return &ParseError{"", "bad TKEY otherday", l}
  1557. }
  1558. rr.OtherData = l.token
  1559. return nil
  1560. }
  1561. func (rr *APL) parse(c *zlexer, o string) *ParseError {
  1562. var prefixes []APLPrefix
  1563. for {
  1564. l, _ := c.Next()
  1565. if l.value == zNewline || l.value == zEOF {
  1566. break
  1567. }
  1568. if l.value == zBlank && prefixes != nil {
  1569. continue
  1570. }
  1571. if l.value != zString {
  1572. return &ParseError{"", "unexpected APL field", l}
  1573. }
  1574. // Expected format: [!]afi:address/prefix
  1575. colon := strings.IndexByte(l.token, ':')
  1576. if colon == -1 {
  1577. return &ParseError{"", "missing colon in APL field", l}
  1578. }
  1579. family, cidr := l.token[:colon], l.token[colon+1:]
  1580. var negation bool
  1581. if family != "" && family[0] == '!' {
  1582. negation = true
  1583. family = family[1:]
  1584. }
  1585. afi, e := strconv.ParseUint(family, 10, 16)
  1586. if e != nil {
  1587. return &ParseError{"", "failed to parse APL family: " + e.Error(), l}
  1588. }
  1589. var addrLen int
  1590. switch afi {
  1591. case 1:
  1592. addrLen = net.IPv4len
  1593. case 2:
  1594. addrLen = net.IPv6len
  1595. default:
  1596. return &ParseError{"", "unrecognized APL family", l}
  1597. }
  1598. ip, subnet, e1 := net.ParseCIDR(cidr)
  1599. if e1 != nil {
  1600. return &ParseError{"", "failed to parse APL address: " + e1.Error(), l}
  1601. }
  1602. if !ip.Equal(subnet.IP) {
  1603. return &ParseError{"", "extra bits in APL address", l}
  1604. }
  1605. if len(subnet.IP) != addrLen {
  1606. return &ParseError{"", "address mismatch with the APL family", l}
  1607. }
  1608. prefixes = append(prefixes, APLPrefix{
  1609. Negation: negation,
  1610. Network: *subnet,
  1611. })
  1612. }
  1613. rr.Prefixes = prefixes
  1614. return nil
  1615. }