tangled
alpha
login
or
join now
seiso.moe
/
magna
1
fork
atom
a go dns packet parser
1
fork
atom
overview
issues
13
pulls
1
pipelines
feat: add rfc-1183 rr types
seiso.moe
10 months ago
769f3afc
6928c799
+275
-17
2 changed files
expand all
collapse all
unified
split
resource_record.go
types.go
+225
resource_record.go
···
536
536
return strings.Join(quoted, " ")
537
537
}
538
538
539
539
+
func (rp *RP) Decode(buf []byte, offset int, rdlength int) (int, error) {
540
540
+
var err error
541
541
+
rp.MBoxDName, offset, err = decodeDomain(buf, offset)
542
542
+
if err != nil {
543
543
+
return offset, fmt.Errorf("RP record: failed to decode mbox-dname: %w", err)
544
544
+
}
545
545
+
546
546
+
rp.TXTDName, offset, err = decodeDomain(buf, offset)
547
547
+
if err != nil {
548
548
+
return offset, fmt.Errorf("RP record: failed to decode txt-dname: %w", err)
549
549
+
}
550
550
+
551
551
+
return offset, nil
552
552
+
}
553
553
+
554
554
+
func (rp *RP) Encode(bytes []byte, offsets *map[string]uint16) ([]byte, error) {
555
555
+
var err error
556
556
+
bytes, err = encodeDomain(bytes, rp.MBoxDName, offsets)
557
557
+
if err != nil {
558
558
+
return nil, fmt.Errorf("RP record: failed to encode mbox-dname %s: %w", rp.MBoxDName, err)
559
559
+
}
560
560
+
561
561
+
bytes, err = encodeDomain(bytes, rp.TXTDName, offsets)
562
562
+
if err != nil {
563
563
+
return nil, fmt.Errorf("RP record: failed to encode txt-dname %s: %w", rp.TXTDName, err)
564
564
+
}
565
565
+
566
566
+
return bytes, nil
567
567
+
}
568
568
+
569
569
+
func (rp RP) String() string {
570
570
+
return fmt.Sprintf("%s %s", rp.MBoxDName, rp.TXTDName)
571
571
+
}
572
572
+
573
573
+
func (a *AFSDB) Decode(buf []byte, offset int, rdlength int) (int, error) {
574
574
+
var err error
575
575
+
a.Subtype, offset, err = getU16(buf, offset)
576
576
+
if err != nil || !(a.Subtype == 1 || a.Subtype == 2) {
577
577
+
return offset, fmt.Errorf("AFSDB record: failed to decode Subtype: %w", err)
578
578
+
}
579
579
+
580
580
+
a.Hostname, offset, err = decodeDomain(buf, offset)
581
581
+
if err != nil {
582
582
+
return offset, fmt.Errorf("AFSDB record: failed to decode Hostname: %w", err)
583
583
+
}
584
584
+
585
585
+
return offset, nil
586
586
+
}
587
587
+
588
588
+
func (a *AFSDB) Encode(bytes []byte, offsets *map[string]uint16) ([]byte, error) {
589
589
+
var err error
590
590
+
bytes = binary.BigEndian.AppendUint16(bytes, a.Subtype)
591
591
+
bytes, err = encodeDomain(bytes, a.Hostname, offsets)
592
592
+
if err != nil {
593
593
+
return nil, fmt.Errorf("AFSDB record: failed to encode Domain %s: %w", a.Hostname, err)
594
594
+
}
595
595
+
596
596
+
return bytes, nil
597
597
+
}
598
598
+
599
599
+
func (a AFSDB) String() string {
600
600
+
return fmt.Sprintf("%d %s", a.Subtype, a.Hostname)
601
601
+
}
602
602
+
603
603
+
func (x *X25) Decode(buf []byte, offset int, rdlength int) (int, error) {
604
604
+
var err error
605
605
+
endOffset := offset + rdlength
606
606
+
if endOffset > len(buf) {
607
607
+
return len(buf), &BufferOverflowError{Length: len(buf), Offset: endOffset}
608
608
+
}
609
609
+
610
610
+
strLen, nextOffsetAfterLen, err := getU8(buf, offset)
611
611
+
if err != nil {
612
612
+
return len(buf), fmt.Errorf("x25 record: failed to read string length byte: %w", err)
613
613
+
}
614
614
+
615
615
+
nextOffsetAfterData := nextOffsetAfterLen + int(strLen)
616
616
+
if nextOffsetAfterData > endOffset {
617
617
+
return len(buf), fmt.Errorf("x25 record: string segment length %d exceeds RDLENGTH boundary %d", strLen, endOffset)
618
618
+
}
619
619
+
620
620
+
strBytes, return_offset, err := getSlice(buf, nextOffsetAfterLen, int(strLen))
621
621
+
if err != nil {
622
622
+
return len(buf), fmt.Errorf("x25 record: failed to read string data (length %d): %w", strLen, err)
623
623
+
}
624
624
+
625
625
+
x.PSDNAddress = string(strBytes)
626
626
+
for _, c := range x.PSDNAddress {
627
627
+
if c < '0' || c > '9' {
628
628
+
return offset, fmt.Errorf("X25 record: PSDN address contains non-digit character: %c", c)
629
629
+
}
630
630
+
}
631
631
+
632
632
+
return return_offset, nil
633
633
+
}
634
634
+
635
635
+
func (x *X25) Encode(bytes []byte, offsets *map[string]uint16) ([]byte, error) {
636
636
+
for _, r := range x.PSDNAddress {
637
637
+
if r < '0' || r > '9' {
638
638
+
return nil, fmt.Errorf("X25 record: PSDN address contains non-digit character: %c", r)
639
639
+
}
640
640
+
}
641
641
+
642
642
+
bytes = append(bytes, byte(len(x.PSDNAddress)))
643
643
+
bytes = append(bytes, []byte(x.PSDNAddress)...)
644
644
+
645
645
+
return bytes, nil
646
646
+
}
647
647
+
648
648
+
func (x X25) String() string {
649
649
+
return x.PSDNAddress
650
650
+
}
651
651
+
652
652
+
func (isdn *ISDN) Decode(buf []byte, offset int, rdlength int) (int, error) {
653
653
+
var err error
654
654
+
endOffset := offset + rdlength
655
655
+
if endOffset > len(buf) {
656
656
+
return len(buf), &BufferOverflowError{Length: len(buf), Offset: endOffset}
657
657
+
}
658
658
+
659
659
+
strLen, nextOffsetAfterLen, err := getU8(buf, offset)
660
660
+
if err != nil {
661
661
+
return len(buf), fmt.Errorf("ISDN record: failed to read string length byte: %w", err)
662
662
+
}
663
663
+
664
664
+
nextOffsetAfterData := nextOffsetAfterLen + int(strLen)
665
665
+
if nextOffsetAfterData > endOffset {
666
666
+
return len(buf), fmt.Errorf("ISDN record: string segment length %d exceeds RDLENGTH boundary %d", strLen, endOffset)
667
667
+
}
668
668
+
669
669
+
strBytes, offset, err := getSlice(buf, nextOffsetAfterLen, int(strLen))
670
670
+
if err != nil {
671
671
+
return len(buf), fmt.Errorf("ISDN record: failed to read string data (length %d): %w", strLen, err)
672
672
+
}
673
673
+
674
674
+
isdn.ISDNAddress = string(strBytes)
675
675
+
for _, c := range isdn.ISDNAddress {
676
676
+
if c < '0' || c > '9' {
677
677
+
return offset, fmt.Errorf("ISDN record: ISDN address contains non-digit character: %c", c)
678
678
+
}
679
679
+
}
680
680
+
681
681
+
// the subaddress is an optional field
682
682
+
if offset < endOffset {
683
683
+
subAddrLen, nextOffsetAfterSubAddrLen, err := getU8(buf, offset)
684
684
+
if err != nil {
685
685
+
return offset, fmt.Errorf("ISDN record: failed to read subaddress length: %w", err)
686
686
+
}
687
687
+
offset = nextOffsetAfterSubAddrLen
688
688
+
689
689
+
if offset+int(subAddrLen) > endOffset {
690
690
+
return offset, fmt.Errorf("ISDN record: subaddress data length %d exceeds RDLENGTH boundary (available: %d bytes from offset %d up to %d)", subAddrLen, endOffset-offset, offset, endOffset)
691
691
+
}
692
692
+
693
693
+
subAddrBytes, nextOffsetAfterSubAddrData, err := getSlice(buf, offset, int(subAddrLen))
694
694
+
if err != nil {
695
695
+
return offset, fmt.Errorf("ISDN record: failed to read subaddress data (length %d): %w", subAddrLen, err)
696
696
+
}
697
697
+
offset = nextOffsetAfterSubAddrData
698
698
+
isdn.Subaddress = string(subAddrBytes)
699
699
+
} else {
700
700
+
isdn.Subaddress = ""
701
701
+
}
702
702
+
703
703
+
return offset, nil
704
704
+
}
705
705
+
706
706
+
func (isdn *ISDN) Encode(bytes []byte, offsets *map[string]uint16) ([]byte, error) {
707
707
+
bytes = append(bytes, byte(len(isdn.ISDNAddress)))
708
708
+
bytes = append(bytes, []byte(isdn.ISDNAddress)...)
709
709
+
710
710
+
if isdn.Subaddress != "" {
711
711
+
bytes = append(bytes, byte(len(isdn.Subaddress)))
712
712
+
bytes = append(bytes, []byte(isdn.Subaddress)...)
713
713
+
}
714
714
+
return bytes, nil
715
715
+
}
716
716
+
717
717
+
func (isdn ISDN) String() string {
718
718
+
if isdn.Subaddress != "" {
719
719
+
return fmt.Sprintf("%q %q", isdn.ISDNAddress, isdn.Subaddress)
720
720
+
}
721
721
+
return fmt.Sprintf("%q", isdn.ISDNAddress)
722
722
+
}
723
723
+
724
724
+
func (rt *RT) Decode(buf []byte, offset int, rdlength int) (int, error) {
725
725
+
var err error
726
726
+
rt.Preference, offset, err = getU16(buf, offset)
727
727
+
if err != nil {
728
728
+
return offset, fmt.Errorf("RT record: failed to decode Preference: %w", err)
729
729
+
}
730
730
+
731
731
+
rt.IntermediateHost, offset, err = decodeDomain(buf, offset)
732
732
+
if err != nil {
733
733
+
return offset, fmt.Errorf("RT record: failed to decode Exchange: %w", err)
734
734
+
}
735
735
+
736
736
+
return offset, nil
737
737
+
}
738
738
+
739
739
+
func (rt *RT) Encode(bytes []byte, offsets *map[string]uint16) ([]byte, error) {
740
740
+
var err error
741
741
+
bytes = binary.BigEndian.AppendUint16(bytes, rt.Preference)
742
742
+
bytes, err = encodeDomain(bytes, rt.IntermediateHost, offsets)
743
743
+
if err != nil {
744
744
+
return nil, fmt.Errorf("RT record: failed to encode Intermediate Host %s: %w", rt.IntermediateHost, err)
745
745
+
}
746
746
+
747
747
+
return bytes, nil
748
748
+
}
749
749
+
750
750
+
func (rt RT) String() string {
751
751
+
return fmt.Sprintf("%d %s", rt.Preference, rt.IntermediateHost)
752
752
+
}
753
753
+
539
754
func (r *Reserved) Decode(buf []byte, offset int, rdlength int) (int, error) {
540
755
var err error
541
756
r.Bytes, offset, err = getSlice(buf, offset, int(rdlength))
···
619
834
r.RData = &MX{}
620
835
case 16:
621
836
r.RData = &TXT{}
837
837
+
case 17:
838
838
+
r.RData = &RP{}
839
839
+
case 18:
840
840
+
r.RData = &AFSDB{}
841
841
+
case 19:
842
842
+
r.RData = &X25{}
843
843
+
case 20:
844
844
+
r.RData = &ISDN{}
845
845
+
case 21:
846
846
+
r.RData = &RT{}
622
847
default:
623
848
r.RData = &Reserved{}
624
849
}
+50
-17
types.go
···
67
67
}
68
68
69
69
const (
70
70
-
AType DNSType = iota + 1
71
71
-
NSType
72
72
-
MDType
73
73
-
MFType
74
74
-
CNAMEType
75
75
-
SOAType
76
76
-
MBType
77
77
-
MGType
78
78
-
MRType
79
79
-
NULLType
80
80
-
WKSType
81
81
-
PTRType
82
82
-
HINFOType
83
83
-
MINFOType
84
84
-
MXType
85
85
-
TXTType
86
86
-
AFSDBType
70
70
+
AType DNSType = 1
71
71
+
NSType = 2
72
72
+
MDType = 3
73
73
+
MFType = 4
74
74
+
CNAMEType = 5
75
75
+
SOAType = 6
76
76
+
MBType = 7
77
77
+
MGType = 8
78
78
+
MRType = 9
79
79
+
NULLType = 10
80
80
+
WKSType = 11
81
81
+
PTRType = 12
82
82
+
HINFOType = 13
83
83
+
MINFOType = 14
84
84
+
MXType = 15
85
85
+
TXTType = 16
86
86
+
RPType = 17
87
87
+
AFSDBType = 18
88
88
+
X25Type = 19
89
89
+
ISDNType = 20
90
90
+
RTType = 21
87
91
88
92
AXFRType = 252
89
93
MAILBType = 253
···
127
131
return "TXT"
128
132
case AFSDBType:
129
133
return "AFSDB"
134
134
+
case RPType:
135
135
+
return "RP"
136
136
+
case X25Type:
137
137
+
return "X25"
138
138
+
case ISDNType:
139
139
+
return "ISDN"
140
140
+
case RTType:
141
141
+
return "RT"
130
142
case AXFRType:
131
143
return "AXFR"
132
144
case MAILBType:
···
324
336
}
325
337
326
338
type AFSDB struct {
339
339
+
Subtype uint16
340
340
+
Hostname string
341
341
+
}
342
342
+
343
343
+
type RP struct {
344
344
+
MBoxDName string
345
345
+
TXTDName string
346
346
+
}
347
347
+
348
348
+
type X25 struct {
349
349
+
PSDNAddress string
350
350
+
}
351
351
+
352
352
+
type ISDN struct {
353
353
+
ISDNAddress string
354
354
+
Subaddress string
355
355
+
}
356
356
+
357
357
+
type RT struct {
358
358
+
Preference uint16
359
359
+
IntermediateHost string
327
360
}
328
361
329
362
// Reserved represents a record that is not yet implemented.