msg_helpers.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. package dns
  2. import (
  3. "encoding/base32"
  4. "encoding/base64"
  5. "encoding/binary"
  6. "encoding/hex"
  7. "net"
  8. "strings"
  9. )
  10. // helper functions called from the generated zmsg.go
  11. // These function are named after the tag to help pack/unpack, if there is no tag it is the name
  12. // of the type they pack/unpack (string, int, etc). We prefix all with unpackData or packData, so packDataA or
  13. // packDataDomainName.
  14. func unpackDataA(msg []byte, off int) (net.IP, int, error) {
  15. if off+net.IPv4len > len(msg) {
  16. return nil, len(msg), &Error{err: "overflow unpacking a"}
  17. }
  18. a := append(make(net.IP, 0, net.IPv4len), msg[off:off+net.IPv4len]...)
  19. off += net.IPv4len
  20. return a, off, nil
  21. }
  22. func packDataA(a net.IP, msg []byte, off int) (int, error) {
  23. switch len(a) {
  24. case net.IPv4len, net.IPv6len:
  25. // It must be a slice of 4, even if it is 16, we encode only the first 4
  26. if off+net.IPv4len > len(msg) {
  27. return len(msg), &Error{err: "overflow packing a"}
  28. }
  29. copy(msg[off:], a.To4())
  30. off += net.IPv4len
  31. case 0:
  32. // Allowed, for dynamic updates.
  33. default:
  34. return len(msg), &Error{err: "overflow packing a"}
  35. }
  36. return off, nil
  37. }
  38. func unpackDataAAAA(msg []byte, off int) (net.IP, int, error) {
  39. if off+net.IPv6len > len(msg) {
  40. return nil, len(msg), &Error{err: "overflow unpacking aaaa"}
  41. }
  42. aaaa := append(make(net.IP, 0, net.IPv6len), msg[off:off+net.IPv6len]...)
  43. off += net.IPv6len
  44. return aaaa, off, nil
  45. }
  46. func packDataAAAA(aaaa net.IP, msg []byte, off int) (int, error) {
  47. switch len(aaaa) {
  48. case net.IPv6len:
  49. if off+net.IPv6len > len(msg) {
  50. return len(msg), &Error{err: "overflow packing aaaa"}
  51. }
  52. copy(msg[off:], aaaa)
  53. off += net.IPv6len
  54. case 0:
  55. // Allowed, dynamic updates.
  56. default:
  57. return len(msg), &Error{err: "overflow packing aaaa"}
  58. }
  59. return off, nil
  60. }
  61. // unpackHeader unpacks an RR header, returning the offset to the end of the header and a
  62. // re-sliced msg according to the expected length of the RR.
  63. func unpackHeader(msg []byte, off int) (rr RR_Header, off1 int, truncmsg []byte, err error) {
  64. hdr := RR_Header{}
  65. if off == len(msg) {
  66. return hdr, off, msg, nil
  67. }
  68. hdr.Name, off, err = UnpackDomainName(msg, off)
  69. if err != nil {
  70. return hdr, len(msg), msg, err
  71. }
  72. hdr.Rrtype, off, err = unpackUint16(msg, off)
  73. if err != nil {
  74. return hdr, len(msg), msg, err
  75. }
  76. hdr.Class, off, err = unpackUint16(msg, off)
  77. if err != nil {
  78. return hdr, len(msg), msg, err
  79. }
  80. hdr.Ttl, off, err = unpackUint32(msg, off)
  81. if err != nil {
  82. return hdr, len(msg), msg, err
  83. }
  84. hdr.Rdlength, off, err = unpackUint16(msg, off)
  85. if err != nil {
  86. return hdr, len(msg), msg, err
  87. }
  88. msg, err = truncateMsgFromRdlength(msg, off, hdr.Rdlength)
  89. return hdr, off, msg, err
  90. }
  91. // packHeader packs an RR header, returning the offset to the end of the header.
  92. // See PackDomainName for documentation about the compression.
  93. func (hdr RR_Header) packHeader(msg []byte, off int, compression compressionMap, compress bool) (int, error) {
  94. if off == len(msg) {
  95. return off, nil
  96. }
  97. off, err := packDomainName(hdr.Name, msg, off, compression, compress)
  98. if err != nil {
  99. return len(msg), err
  100. }
  101. off, err = packUint16(hdr.Rrtype, msg, off)
  102. if err != nil {
  103. return len(msg), err
  104. }
  105. off, err = packUint16(hdr.Class, msg, off)
  106. if err != nil {
  107. return len(msg), err
  108. }
  109. off, err = packUint32(hdr.Ttl, msg, off)
  110. if err != nil {
  111. return len(msg), err
  112. }
  113. off, err = packUint16(0, msg, off) // The RDLENGTH field will be set later in packRR.
  114. if err != nil {
  115. return len(msg), err
  116. }
  117. return off, nil
  118. }
  119. // helper helper functions.
  120. // truncateMsgFromRdLength truncates msg to match the expected length of the RR.
  121. // Returns an error if msg is smaller than the expected size.
  122. func truncateMsgFromRdlength(msg []byte, off int, rdlength uint16) (truncmsg []byte, err error) {
  123. lenrd := off + int(rdlength)
  124. if lenrd > len(msg) {
  125. return msg, &Error{err: "overflowing header size"}
  126. }
  127. return msg[:lenrd], nil
  128. }
  129. var base32HexNoPadEncoding = base32.HexEncoding.WithPadding(base32.NoPadding)
  130. func fromBase32(s []byte) (buf []byte, err error) {
  131. for i, b := range s {
  132. if b >= 'a' && b <= 'z' {
  133. s[i] = b - 32
  134. }
  135. }
  136. buflen := base32HexNoPadEncoding.DecodedLen(len(s))
  137. buf = make([]byte, buflen)
  138. n, err := base32HexNoPadEncoding.Decode(buf, s)
  139. buf = buf[:n]
  140. return
  141. }
  142. func toBase32(b []byte) string {
  143. return base32HexNoPadEncoding.EncodeToString(b)
  144. }
  145. func fromBase64(s []byte) (buf []byte, err error) {
  146. buflen := base64.StdEncoding.DecodedLen(len(s))
  147. buf = make([]byte, buflen)
  148. n, err := base64.StdEncoding.Decode(buf, s)
  149. buf = buf[:n]
  150. return
  151. }
  152. func toBase64(b []byte) string { return base64.StdEncoding.EncodeToString(b) }
  153. // dynamicUpdate returns true if the Rdlength is zero.
  154. func noRdata(h RR_Header) bool { return h.Rdlength == 0 }
  155. func unpackUint8(msg []byte, off int) (i uint8, off1 int, err error) {
  156. if off+1 > len(msg) {
  157. return 0, len(msg), &Error{err: "overflow unpacking uint8"}
  158. }
  159. return msg[off], off + 1, nil
  160. }
  161. func packUint8(i uint8, msg []byte, off int) (off1 int, err error) {
  162. if off+1 > len(msg) {
  163. return len(msg), &Error{err: "overflow packing uint8"}
  164. }
  165. msg[off] = i
  166. return off + 1, nil
  167. }
  168. func unpackUint16(msg []byte, off int) (i uint16, off1 int, err error) {
  169. if off+2 > len(msg) {
  170. return 0, len(msg), &Error{err: "overflow unpacking uint16"}
  171. }
  172. return binary.BigEndian.Uint16(msg[off:]), off + 2, nil
  173. }
  174. func packUint16(i uint16, msg []byte, off int) (off1 int, err error) {
  175. if off+2 > len(msg) {
  176. return len(msg), &Error{err: "overflow packing uint16"}
  177. }
  178. binary.BigEndian.PutUint16(msg[off:], i)
  179. return off + 2, nil
  180. }
  181. func unpackUint32(msg []byte, off int) (i uint32, off1 int, err error) {
  182. if off+4 > len(msg) {
  183. return 0, len(msg), &Error{err: "overflow unpacking uint32"}
  184. }
  185. return binary.BigEndian.Uint32(msg[off:]), off + 4, nil
  186. }
  187. func packUint32(i uint32, msg []byte, off int) (off1 int, err error) {
  188. if off+4 > len(msg) {
  189. return len(msg), &Error{err: "overflow packing uint32"}
  190. }
  191. binary.BigEndian.PutUint32(msg[off:], i)
  192. return off + 4, nil
  193. }
  194. func unpackUint48(msg []byte, off int) (i uint64, off1 int, err error) {
  195. if off+6 > len(msg) {
  196. return 0, len(msg), &Error{err: "overflow unpacking uint64 as uint48"}
  197. }
  198. // Used in TSIG where the last 48 bits are occupied, so for now, assume a uint48 (6 bytes)
  199. i = uint64(msg[off])<<40 | uint64(msg[off+1])<<32 | uint64(msg[off+2])<<24 | uint64(msg[off+3])<<16 |
  200. uint64(msg[off+4])<<8 | uint64(msg[off+5])
  201. off += 6
  202. return i, off, nil
  203. }
  204. func packUint48(i uint64, msg []byte, off int) (off1 int, err error) {
  205. if off+6 > len(msg) {
  206. return len(msg), &Error{err: "overflow packing uint64 as uint48"}
  207. }
  208. msg[off] = byte(i >> 40)
  209. msg[off+1] = byte(i >> 32)
  210. msg[off+2] = byte(i >> 24)
  211. msg[off+3] = byte(i >> 16)
  212. msg[off+4] = byte(i >> 8)
  213. msg[off+5] = byte(i)
  214. off += 6
  215. return off, nil
  216. }
  217. func unpackUint64(msg []byte, off int) (i uint64, off1 int, err error) {
  218. if off+8 > len(msg) {
  219. return 0, len(msg), &Error{err: "overflow unpacking uint64"}
  220. }
  221. return binary.BigEndian.Uint64(msg[off:]), off + 8, nil
  222. }
  223. func packUint64(i uint64, msg []byte, off int) (off1 int, err error) {
  224. if off+8 > len(msg) {
  225. return len(msg), &Error{err: "overflow packing uint64"}
  226. }
  227. binary.BigEndian.PutUint64(msg[off:], i)
  228. off += 8
  229. return off, nil
  230. }
  231. func unpackString(msg []byte, off int) (string, int, error) {
  232. if off+1 > len(msg) {
  233. return "", off, &Error{err: "overflow unpacking txt"}
  234. }
  235. l := int(msg[off])
  236. off++
  237. if off+l > len(msg) {
  238. return "", off, &Error{err: "overflow unpacking txt"}
  239. }
  240. var s strings.Builder
  241. consumed := 0
  242. for i, b := range msg[off : off+l] {
  243. switch {
  244. case b == '"' || b == '\\':
  245. if consumed == 0 {
  246. s.Grow(l * 2)
  247. }
  248. s.Write(msg[off+consumed : off+i])
  249. s.WriteByte('\\')
  250. s.WriteByte(b)
  251. consumed = i + 1
  252. case b < ' ' || b > '~': // unprintable
  253. if consumed == 0 {
  254. s.Grow(l * 2)
  255. }
  256. s.Write(msg[off+consumed : off+i])
  257. s.WriteString(escapeByte(b))
  258. consumed = i + 1
  259. }
  260. }
  261. if consumed == 0 { // no escaping needed
  262. return string(msg[off : off+l]), off + l, nil
  263. }
  264. s.Write(msg[off+consumed : off+l])
  265. return s.String(), off + l, nil
  266. }
  267. func packString(s string, msg []byte, off int) (int, error) {
  268. txtTmp := make([]byte, 256*4+1)
  269. off, err := packTxtString(s, msg, off, txtTmp)
  270. if err != nil {
  271. return len(msg), err
  272. }
  273. return off, nil
  274. }
  275. func unpackStringBase32(msg []byte, off, end int) (string, int, error) {
  276. if end > len(msg) {
  277. return "", len(msg), &Error{err: "overflow unpacking base32"}
  278. }
  279. s := toBase32(msg[off:end])
  280. return s, end, nil
  281. }
  282. func packStringBase32(s string, msg []byte, off int) (int, error) {
  283. b32, err := fromBase32([]byte(s))
  284. if err != nil {
  285. return len(msg), err
  286. }
  287. if off+len(b32) > len(msg) {
  288. return len(msg), &Error{err: "overflow packing base32"}
  289. }
  290. copy(msg[off:off+len(b32)], b32)
  291. off += len(b32)
  292. return off, nil
  293. }
  294. func unpackStringBase64(msg []byte, off, end int) (string, int, error) {
  295. // Rest of the RR is base64 encoded value, so we don't need an explicit length
  296. // to be set. Thus far all RR's that have base64 encoded fields have those as their
  297. // last one. What we do need is the end of the RR!
  298. if end > len(msg) {
  299. return "", len(msg), &Error{err: "overflow unpacking base64"}
  300. }
  301. s := toBase64(msg[off:end])
  302. return s, end, nil
  303. }
  304. func packStringBase64(s string, msg []byte, off int) (int, error) {
  305. b64, err := fromBase64([]byte(s))
  306. if err != nil {
  307. return len(msg), err
  308. }
  309. if off+len(b64) > len(msg) {
  310. return len(msg), &Error{err: "overflow packing base64"}
  311. }
  312. copy(msg[off:off+len(b64)], b64)
  313. off += len(b64)
  314. return off, nil
  315. }
  316. func unpackStringHex(msg []byte, off, end int) (string, int, error) {
  317. // Rest of the RR is hex encoded value, so we don't need an explicit length
  318. // to be set. NSEC and TSIG have hex fields with a length field.
  319. // What we do need is the end of the RR!
  320. if end > len(msg) {
  321. return "", len(msg), &Error{err: "overflow unpacking hex"}
  322. }
  323. s := hex.EncodeToString(msg[off:end])
  324. return s, end, nil
  325. }
  326. func packStringHex(s string, msg []byte, off int) (int, error) {
  327. h, err := hex.DecodeString(s)
  328. if err != nil {
  329. return len(msg), err
  330. }
  331. if off+len(h) > len(msg) {
  332. return len(msg), &Error{err: "overflow packing hex"}
  333. }
  334. copy(msg[off:off+len(h)], h)
  335. off += len(h)
  336. return off, nil
  337. }
  338. func unpackStringAny(msg []byte, off, end int) (string, int, error) {
  339. if end > len(msg) {
  340. return "", len(msg), &Error{err: "overflow unpacking anything"}
  341. }
  342. return string(msg[off:end]), end, nil
  343. }
  344. func packStringAny(s string, msg []byte, off int) (int, error) {
  345. if off+len(s) > len(msg) {
  346. return len(msg), &Error{err: "overflow packing anything"}
  347. }
  348. copy(msg[off:off+len(s)], s)
  349. off += len(s)
  350. return off, nil
  351. }
  352. func unpackStringTxt(msg []byte, off int) ([]string, int, error) {
  353. txt, off, err := unpackTxt(msg, off)
  354. if err != nil {
  355. return nil, len(msg), err
  356. }
  357. return txt, off, nil
  358. }
  359. func packStringTxt(s []string, msg []byte, off int) (int, error) {
  360. txtTmp := make([]byte, 256*4+1) // If the whole string consists out of \DDD we need this many.
  361. off, err := packTxt(s, msg, off, txtTmp)
  362. if err != nil {
  363. return len(msg), err
  364. }
  365. return off, nil
  366. }
  367. func unpackDataOpt(msg []byte, off int) ([]EDNS0, int, error) {
  368. var edns []EDNS0
  369. Option:
  370. var code uint16
  371. if off+4 > len(msg) {
  372. return nil, len(msg), &Error{err: "overflow unpacking opt"}
  373. }
  374. code = binary.BigEndian.Uint16(msg[off:])
  375. off += 2
  376. optlen := binary.BigEndian.Uint16(msg[off:])
  377. off += 2
  378. if off+int(optlen) > len(msg) {
  379. return nil, len(msg), &Error{err: "overflow unpacking opt"}
  380. }
  381. switch code {
  382. case EDNS0NSID:
  383. e := new(EDNS0_NSID)
  384. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  385. return nil, len(msg), err
  386. }
  387. edns = append(edns, e)
  388. off += int(optlen)
  389. case EDNS0SUBNET:
  390. e := new(EDNS0_SUBNET)
  391. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  392. return nil, len(msg), err
  393. }
  394. edns = append(edns, e)
  395. off += int(optlen)
  396. case EDNS0COOKIE:
  397. e := new(EDNS0_COOKIE)
  398. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  399. return nil, len(msg), err
  400. }
  401. edns = append(edns, e)
  402. off += int(optlen)
  403. case EDNS0EXPIRE:
  404. e := new(EDNS0_EXPIRE)
  405. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  406. return nil, len(msg), err
  407. }
  408. edns = append(edns, e)
  409. off += int(optlen)
  410. case EDNS0UL:
  411. e := new(EDNS0_UL)
  412. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  413. return nil, len(msg), err
  414. }
  415. edns = append(edns, e)
  416. off += int(optlen)
  417. case EDNS0LLQ:
  418. e := new(EDNS0_LLQ)
  419. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  420. return nil, len(msg), err
  421. }
  422. edns = append(edns, e)
  423. off += int(optlen)
  424. case EDNS0DAU:
  425. e := new(EDNS0_DAU)
  426. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  427. return nil, len(msg), err
  428. }
  429. edns = append(edns, e)
  430. off += int(optlen)
  431. case EDNS0DHU:
  432. e := new(EDNS0_DHU)
  433. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  434. return nil, len(msg), err
  435. }
  436. edns = append(edns, e)
  437. off += int(optlen)
  438. case EDNS0N3U:
  439. e := new(EDNS0_N3U)
  440. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  441. return nil, len(msg), err
  442. }
  443. edns = append(edns, e)
  444. off += int(optlen)
  445. case EDNS0PADDING:
  446. e := new(EDNS0_PADDING)
  447. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  448. return nil, len(msg), err
  449. }
  450. edns = append(edns, e)
  451. off += int(optlen)
  452. default:
  453. e := new(EDNS0_LOCAL)
  454. e.Code = code
  455. if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
  456. return nil, len(msg), err
  457. }
  458. edns = append(edns, e)
  459. off += int(optlen)
  460. }
  461. if off < len(msg) {
  462. goto Option
  463. }
  464. return edns, off, nil
  465. }
  466. func packDataOpt(options []EDNS0, msg []byte, off int) (int, error) {
  467. for _, el := range options {
  468. b, err := el.pack()
  469. if err != nil || off+4 > len(msg) {
  470. return len(msg), &Error{err: "overflow packing opt"}
  471. }
  472. binary.BigEndian.PutUint16(msg[off:], el.Option()) // Option code
  473. binary.BigEndian.PutUint16(msg[off+2:], uint16(len(b))) // Length
  474. off += 4
  475. if off+len(b) > len(msg) {
  476. copy(msg[off:], b)
  477. off = len(msg)
  478. continue
  479. }
  480. // Actual data
  481. copy(msg[off:off+len(b)], b)
  482. off += len(b)
  483. }
  484. return off, nil
  485. }
  486. func unpackStringOctet(msg []byte, off int) (string, int, error) {
  487. s := string(msg[off:])
  488. return s, len(msg), nil
  489. }
  490. func packStringOctet(s string, msg []byte, off int) (int, error) {
  491. txtTmp := make([]byte, 256*4+1)
  492. off, err := packOctetString(s, msg, off, txtTmp)
  493. if err != nil {
  494. return len(msg), err
  495. }
  496. return off, nil
  497. }
  498. func unpackDataNsec(msg []byte, off int) ([]uint16, int, error) {
  499. var nsec []uint16
  500. length, window, lastwindow := 0, 0, -1
  501. for off < len(msg) {
  502. if off+2 > len(msg) {
  503. return nsec, len(msg), &Error{err: "overflow unpacking nsecx"}
  504. }
  505. window = int(msg[off])
  506. length = int(msg[off+1])
  507. off += 2
  508. if window <= lastwindow {
  509. // RFC 4034: Blocks are present in the NSEC RR RDATA in
  510. // increasing numerical order.
  511. return nsec, len(msg), &Error{err: "out of order NSEC block"}
  512. }
  513. if length == 0 {
  514. // RFC 4034: Blocks with no types present MUST NOT be included.
  515. return nsec, len(msg), &Error{err: "empty NSEC block"}
  516. }
  517. if length > 32 {
  518. return nsec, len(msg), &Error{err: "NSEC block too long"}
  519. }
  520. if off+length > len(msg) {
  521. return nsec, len(msg), &Error{err: "overflowing NSEC block"}
  522. }
  523. // Walk the bytes in the window and extract the type bits
  524. for j, b := range msg[off : off+length] {
  525. // Check the bits one by one, and set the type
  526. if b&0x80 == 0x80 {
  527. nsec = append(nsec, uint16(window*256+j*8+0))
  528. }
  529. if b&0x40 == 0x40 {
  530. nsec = append(nsec, uint16(window*256+j*8+1))
  531. }
  532. if b&0x20 == 0x20 {
  533. nsec = append(nsec, uint16(window*256+j*8+2))
  534. }
  535. if b&0x10 == 0x10 {
  536. nsec = append(nsec, uint16(window*256+j*8+3))
  537. }
  538. if b&0x8 == 0x8 {
  539. nsec = append(nsec, uint16(window*256+j*8+4))
  540. }
  541. if b&0x4 == 0x4 {
  542. nsec = append(nsec, uint16(window*256+j*8+5))
  543. }
  544. if b&0x2 == 0x2 {
  545. nsec = append(nsec, uint16(window*256+j*8+6))
  546. }
  547. if b&0x1 == 0x1 {
  548. nsec = append(nsec, uint16(window*256+j*8+7))
  549. }
  550. }
  551. off += length
  552. lastwindow = window
  553. }
  554. return nsec, off, nil
  555. }
  556. // typeBitMapLen is a helper function which computes the "maximum" length of
  557. // a the NSEC Type BitMap field.
  558. func typeBitMapLen(bitmap []uint16) int {
  559. var l int
  560. var lastwindow, lastlength uint16
  561. for _, t := range bitmap {
  562. window := t / 256
  563. length := (t-window*256)/8 + 1
  564. if window > lastwindow && lastlength != 0 { // New window, jump to the new offset
  565. l += int(lastlength) + 2
  566. lastlength = 0
  567. }
  568. if window < lastwindow || length < lastlength {
  569. // packDataNsec would return Error{err: "nsec bits out of order"} here, but
  570. // when computing the length, we want do be liberal.
  571. continue
  572. }
  573. lastwindow, lastlength = window, length
  574. }
  575. l += int(lastlength) + 2
  576. return l
  577. }
  578. func packDataNsec(bitmap []uint16, msg []byte, off int) (int, error) {
  579. if len(bitmap) == 0 {
  580. return off, nil
  581. }
  582. var lastwindow, lastlength uint16
  583. for _, t := range bitmap {
  584. window := t / 256
  585. length := (t-window*256)/8 + 1
  586. if window > lastwindow && lastlength != 0 { // New window, jump to the new offset
  587. off += int(lastlength) + 2
  588. lastlength = 0
  589. }
  590. if window < lastwindow || length < lastlength {
  591. return len(msg), &Error{err: "nsec bits out of order"}
  592. }
  593. if off+2+int(length) > len(msg) {
  594. return len(msg), &Error{err: "overflow packing nsec"}
  595. }
  596. // Setting the window #
  597. msg[off] = byte(window)
  598. // Setting the octets length
  599. msg[off+1] = byte(length)
  600. // Setting the bit value for the type in the right octet
  601. msg[off+1+int(length)] |= byte(1 << (7 - t%8))
  602. lastwindow, lastlength = window, length
  603. }
  604. off += int(lastlength) + 2
  605. return off, nil
  606. }
  607. func unpackDataDomainNames(msg []byte, off, end int) ([]string, int, error) {
  608. var (
  609. servers []string
  610. s string
  611. err error
  612. )
  613. if end > len(msg) {
  614. return nil, len(msg), &Error{err: "overflow unpacking domain names"}
  615. }
  616. for off < end {
  617. s, off, err = UnpackDomainName(msg, off)
  618. if err != nil {
  619. return servers, len(msg), err
  620. }
  621. servers = append(servers, s)
  622. }
  623. return servers, off, nil
  624. }
  625. func packDataDomainNames(names []string, msg []byte, off int, compression compressionMap, compress bool) (int, error) {
  626. var err error
  627. for _, name := range names {
  628. off, err = packDomainName(name, msg, off, compression, compress)
  629. if err != nil {
  630. return len(msg), err
  631. }
  632. }
  633. return off, nil
  634. }
  635. func packDataApl(data []APLPrefix, msg []byte, off int) (int, error) {
  636. var err error
  637. for i := range data {
  638. off, err = packDataAplPrefix(&data[i], msg, off)
  639. if err != nil {
  640. return len(msg), err
  641. }
  642. }
  643. return off, nil
  644. }
  645. func packDataAplPrefix(p *APLPrefix, msg []byte, off int) (int, error) {
  646. if len(p.Network.IP) != len(p.Network.Mask) {
  647. return len(msg), &Error{err: "address and mask lengths don't match"}
  648. }
  649. var err error
  650. prefix, _ := p.Network.Mask.Size()
  651. addr := p.Network.IP.Mask(p.Network.Mask)[:(prefix+7)/8]
  652. switch len(p.Network.IP) {
  653. case net.IPv4len:
  654. off, err = packUint16(1, msg, off)
  655. case net.IPv6len:
  656. off, err = packUint16(2, msg, off)
  657. default:
  658. err = &Error{err: "unrecognized address family"}
  659. }
  660. if err != nil {
  661. return len(msg), err
  662. }
  663. off, err = packUint8(uint8(prefix), msg, off)
  664. if err != nil {
  665. return len(msg), err
  666. }
  667. var n uint8
  668. if p.Negation {
  669. n = 0x80
  670. }
  671. adflen := uint8(len(addr)) & 0x7f
  672. off, err = packUint8(n|adflen, msg, off)
  673. if err != nil {
  674. return len(msg), err
  675. }
  676. if off+len(addr) > len(msg) {
  677. return len(msg), &Error{err: "overflow packing APL prefix"}
  678. }
  679. off += copy(msg[off:], addr)
  680. return off, nil
  681. }
  682. func unpackDataApl(msg []byte, off int) ([]APLPrefix, int, error) {
  683. var result []APLPrefix
  684. for off < len(msg) {
  685. prefix, end, err := unpackDataAplPrefix(msg, off)
  686. if err != nil {
  687. return nil, len(msg), err
  688. }
  689. off = end
  690. result = append(result, prefix)
  691. }
  692. return result, off, nil
  693. }
  694. func unpackDataAplPrefix(msg []byte, off int) (APLPrefix, int, error) {
  695. family, off, err := unpackUint16(msg, off)
  696. if err != nil {
  697. return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL prefix"}
  698. }
  699. prefix, off, err := unpackUint8(msg, off)
  700. if err != nil {
  701. return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL prefix"}
  702. }
  703. nlen, off, err := unpackUint8(msg, off)
  704. if err != nil {
  705. return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL prefix"}
  706. }
  707. var ip []byte
  708. switch family {
  709. case 1:
  710. ip = make([]byte, net.IPv4len)
  711. case 2:
  712. ip = make([]byte, net.IPv6len)
  713. default:
  714. return APLPrefix{}, len(msg), &Error{err: "unrecognized APL address family"}
  715. }
  716. if int(prefix) > 8*len(ip) {
  717. return APLPrefix{}, len(msg), &Error{err: "APL prefix too long"}
  718. }
  719. afdlen := int(nlen & 0x7f)
  720. if (int(prefix)+7)/8 != afdlen {
  721. return APLPrefix{}, len(msg), &Error{err: "invalid APL address length"}
  722. }
  723. if off+afdlen > len(msg) {
  724. return APLPrefix{}, len(msg), &Error{err: "overflow unpacking APL address"}
  725. }
  726. off += copy(ip, msg[off:off+afdlen])
  727. if prefix%8 > 0 {
  728. last := ip[afdlen-1]
  729. zero := uint8(0xff) >> (prefix % 8)
  730. if last&zero > 0 {
  731. return APLPrefix{}, len(msg), &Error{err: "extra APL address bits"}
  732. }
  733. }
  734. return APLPrefix{
  735. Negation: (nlen & 0x80) != 0,
  736. Network: net.IPNet{
  737. IP: ip,
  738. Mask: net.CIDRMask(int(prefix), 8*len(ip)),
  739. },
  740. }, off, nil
  741. }