msg_helpers.go 22 KB

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