Skip to content

Commit d26cbc8

Browse files
committed
Adjust API
1 parent fb0f751 commit d26cbc8

27 files changed

Lines changed: 241 additions & 237 deletions

conn.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -738,14 +738,13 @@ func (c *Conn) processHandshakePacket(pkt *packet, dtlsHandshake *handshake.Hand
738738
SequenceNumber: pkt.record.Header.SequenceNumber,
739739
}
740740

741-
hs := recordlayer.FixedHeaderSize + len(cidHeader.ConnectionID)
742-
rawPacket = make([]byte, hs+len(rawInner))
743-
err = cidHeader.MarshalInto(rawPacket)
741+
rawPacket = make([]byte, cidHeader.MarshalSize()+len(rawInner))
742+
_, err = cidHeader.MarshalTo(rawPacket)
744743
if err != nil {
745744
return nil, err
746745
}
747746
pkt.record.Header = *cidHeader
748-
copy(rawPacket[hs:], rawInner)
747+
copy(rawPacket[cidHeader.MarshalSize():], rawInner)
749748
} else {
750749
recordlayerHeader := &recordlayer.Header{
751750
Version: pkt.record.Header.Version,
@@ -755,15 +754,14 @@ func (c *Conn) processHandshakePacket(pkt *packet, dtlsHandshake *handshake.Hand
755754
SequenceNumber: seq,
756755
}
757756

758-
hs := recordlayer.FixedHeaderSize + len(recordlayerHeader.ConnectionID)
759-
rawPacket = make([]byte, hs+len(handshakeFragment))
760-
err = recordlayerHeader.MarshalInto(rawPacket)
757+
rawPacket = make([]byte, recordlayerHeader.MarshalSize()+len(handshakeFragment))
758+
_, err = recordlayerHeader.MarshalTo(rawPacket)
761759
if err != nil {
762760
return nil, err
763761
}
764762

765763
pkt.record.Header = *recordlayerHeader
766-
copy(rawPacket[hs:], handshakeFragment)
764+
copy(rawPacket[recordlayerHeader.MarshalSize():], handshakeFragment)
767765
}
768766

769767
if pkt.shouldEncrypt {
@@ -787,6 +785,11 @@ func (c *Conn) fragmentHandshake(dtlsHandshake *handshake.Handshake) ([][]byte,
787785
}
788786

789787
contentFragments := splitBytes(content, c.maximumTransmissionUnit)
788+
if len(contentFragments) == 0 {
789+
contentFragments = [][]byte{
790+
{},
791+
}
792+
}
790793

791794
offset := 0
792795
fragmentedHandshakes := make([][]byte, 0, len(contentFragments))
@@ -804,7 +807,7 @@ func (c *Conn) fragmentHandshake(dtlsHandshake *handshake.Handshake) ([][]byte,
804807
offset += contentFragmentLen
805808

806809
fragmentedHandshake := make([]byte, handshake.HeaderLength+len(contentFragment))
807-
err := headerFragment.MarshalInto(fragmentedHandshake)
810+
_, err := headerFragment.MarshalTo(fragmentedHandshake)
808811
if err != nil {
809812
return nil, err
810813
}
@@ -1018,7 +1021,7 @@ func (c *Conn) handleIncomingPacket(
10181021
if header.ContentType == protocol.ContentTypeConnectionID {
10191022
originalCID = true
10201023
ip := &recordlayer.InnerPlaintext{}
1021-
if err := ip.Unmarshal(buf[header.Size():]); err != nil { //nolint:govet
1024+
if err := ip.Unmarshal(buf[header.MarshalSize():]); err != nil { //nolint:govet
10221025
c.log.Debugf("unpacking inner plaintext failed: %s", err)
10231026

10241027
return false, false, nil, nil

pkg/crypto/ciphersuite/cbc.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ func NewCBC(
6868

6969
// Encrypt encrypt a DTLS RecordLayer message.
7070
func (c *CBC) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) {
71-
payload := raw[pkt.Header.Size():]
72-
raw = raw[:pkt.Header.Size()]
71+
payload := raw[pkt.Header.MarshalSize():]
72+
raw = raw[:pkt.Header.MarshalSize()]
7373
blockSize := c.writeCBC.BlockSize()
7474

7575
// Generate + Append MAC
@@ -110,7 +110,8 @@ func (c *CBC) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error)
110110
raw = append(raw, payload...)
111111

112112
// Update recordLayer size to include IV+MAC+Padding
113-
binary.BigEndian.PutUint16(raw[pkt.Header.Size()-2:], uint16(len(raw)-pkt.Header.Size())) //nolint:gosec //G115
113+
binary.BigEndian.PutUint16(raw[pkt.Header.MarshalSize()-2:],
114+
uint16(len(raw)-pkt.Header.MarshalSize())) //nolint:gosec //G115
114115

115116
return raw, nil
116117
}
@@ -123,7 +124,7 @@ func (c *CBC) Decrypt(header recordlayer.Header, in []byte) ([]byte, error) {
123124
if err := header.Unmarshal(in); err != nil {
124125
return nil, err
125126
}
126-
body := in[header.Size():]
127+
body := in[header.MarshalSize():]
127128

128129
switch {
129130
case header.ContentType == protocol.ContentTypeChangeCipherSpec:
@@ -171,7 +172,7 @@ func (c *CBC) Decrypt(header recordlayer.Header, in []byte) ([]byte, error) {
171172
return nil, errInvalidMAC
172173
}
173174

174-
return append(in[:header.Size()], body[:dataEnd]...), nil
175+
return append(in[:header.MarshalSize()], body[:dataEnd]...), nil
175176
}
176177

177178
func (c *CBC) hmac(

pkg/crypto/ciphersuite/chacha20poly1305.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ func NewChaCha20Poly1305(localKey, localWriteIV, remoteKey, remoteWriteIV []byte
5151

5252
// Encrypt encrypts a DTLS RecordLayer message.
5353
func (c *ChaCha20Poly1305) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) {
54-
payload := raw[pkt.Header.Size():]
55-
raw = raw[:pkt.Header.Size()]
54+
payload := raw[pkt.Header.MarshalSize():]
55+
raw = raw[:pkt.Header.MarshalSize()]
5656

5757
var nonce [chachaNonceLength]byte
5858
copy(nonce[:], c.localWriteIV)
@@ -80,7 +80,7 @@ func (c *ChaCha20Poly1305) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]
8080
copy(result, raw)
8181
copy(result[len(raw):], encrypted)
8282

83-
binary.BigEndian.PutUint16(result[pkt.Header.Size()-2:], uint16(len(encrypted))) //nolint:gosec
83+
binary.BigEndian.PutUint16(result[pkt.Header.MarshalSize()-2:], uint16(len(encrypted))) //nolint:gosec
8484

8585
return result, nil
8686
}
@@ -108,7 +108,7 @@ func (c *ChaCha20Poly1305) Decrypt(header recordlayer.Header, in []byte) ([]byte
108108
}
109109

110110
// NOTE: ChaCha20-Poly1305 has NO explicit nonce in the record
111-
ciphertext := in[header.Size():]
111+
ciphertext := in[header.MarshalSize():]
112112

113113
var additionalData []byte
114114
if header.ContentType == protocol.ContentTypeConnectionID {
@@ -122,5 +122,5 @@ func (c *ChaCha20Poly1305) Decrypt(header recordlayer.Header, in []byte) ([]byte
122122
return nil, fmt.Errorf("%w: %v", errDecryptPacket, err) //nolint:errorlint
123123
}
124124

125-
return append(in[:header.Size()], plaintext...), nil
125+
return append(in[:header.MarshalSize()], plaintext...), nil
126126
}

pkg/crypto/ciphersuite/chacha20poly1305_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func FuzzChaCha20Poly1305_RoundTrip(f *testing.F) {
5151

5252
var parsedHdr recordlayer.Header
5353
require.NoError(t, parsedHdr.Unmarshal(dec))
54-
got := dec[parsedHdr.Size():]
54+
got := dec[parsedHdr.MarshalSize():]
5555

5656
require.Equal(t, plain, got)
5757
})
@@ -117,7 +117,7 @@ func FuzzChaCha20Poly1305_Bidirectional_RoundTrip(f *testing.F) {
117117
var parsedHdrA recordlayer.Header
118118
require.NoError(t, parsedHdrA.Unmarshal(decAonB))
119119

120-
gotA := decAonB[parsedHdrA.Size():]
120+
gotA := decAonB[parsedHdrA.MarshalSize():]
121121
require.Equal(t, pA, gotA)
122122

123123
// B -> A
@@ -144,7 +144,7 @@ func FuzzChaCha20Poly1305_Bidirectional_RoundTrip(f *testing.F) {
144144
var parsedHdrB recordlayer.Header
145145
require.NoError(t, parsedHdrB.Unmarshal(decBonA))
146146

147-
gotB := decBonA[parsedHdrB.Size():]
147+
gotB := decBonA[parsedHdrB.MarshalSize():]
148148
require.Equal(t, pB, gotB)
149149
})
150150
}

pkg/crypto/ciphersuite/ciphersuite.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ func newAEAD(
7373

7474
// encrypt encrypts a DTLS RecordLayer message.
7575
func (a *aead) encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) {
76-
payload := raw[pkt.Header.Size():]
77-
raw = raw[:pkt.Header.Size()]
76+
payload := raw[pkt.Header.MarshalSize():]
77+
raw = raw[:pkt.Header.MarshalSize()]
7878

7979
// Get nonce buffer from pool
8080
noncePtr := a.nonceBufferPool.Get().(*[]byte) // nolint:forcetypeassert
@@ -93,19 +93,20 @@ func (a *aead) encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error)
9393
additionalData = generateAEADAdditionalData(&pkt.Header, len(payload))
9494
}
9595
finalSize := len(raw) + 8 + len(payload) + a.tagLength
96-
r := make([]byte, finalSize)
97-
copy(r, raw)
98-
copy(r[len(raw):], nonce[4:])
96+
out := make([]byte, finalSize)
97+
copy(out, raw)
98+
copy(out[len(raw):], nonce[4:])
9999

100-
a.localAEAD.Seal(r[len(raw)+8:len(raw)+8], nonce, payload, additionalData)
100+
a.localAEAD.Seal(out[len(raw)+8:len(raw)+8], nonce, payload, additionalData)
101101

102102
// Update recordLayer size to include explicit nonce
103-
binary.BigEndian.PutUint16(r[pkt.Header.Size()-2:], uint16(len(r)-pkt.Header.Size())) //nolint:gosec //G115
103+
binary.BigEndian.PutUint16(out[pkt.Header.MarshalSize()-2:],
104+
uint16(len(out)-pkt.Header.MarshalSize())) //nolint:gosec //G115
104105

105106
// Return nonce buffer to pool
106107
a.nonceBufferPool.Put(noncePtr)
107108

108-
return r, nil
109+
return out, nil
109110
}
110111

111112
// decrypt decrypts a DTLS RecordLayer message.
@@ -117,7 +118,7 @@ func (a *aead) decrypt(header recordlayer.Header, in []byte) ([]byte, error) {
117118
case header.ContentType == protocol.ContentTypeChangeCipherSpec:
118119
// Nothing to encrypt with ChangeCipherSpec
119120
return in, nil
120-
case len(in) <= (8 + header.Size()):
121+
case len(in) <= (8 + header.MarshalSize()):
121122
return nil, errNotEnoughRoomForNonce
122123
}
123124

@@ -126,8 +127,8 @@ func (a *aead) decrypt(header recordlayer.Header, in []byte) ([]byte, error) {
126127
nonce := *noncePtr
127128

128129
copy(nonce[:4], a.remoteWriteIV[:4])
129-
copy(nonce[4:], in[header.Size():header.Size()+8])
130-
out := in[header.Size()+8:]
130+
copy(nonce[4:], in[header.MarshalSize():header.MarshalSize()+8])
131+
out := in[header.MarshalSize()+8:]
131132

132133
var additionalData []byte
133134
if header.ContentType == protocol.ContentTypeConnectionID {
@@ -146,7 +147,7 @@ func (a *aead) decrypt(header recordlayer.Header, in []byte) ([]byte, error) {
146147
// Return nonce buffer to pool
147148
a.nonceBufferPool.Put(noncePtr)
148149

149-
return append(in[:header.Size()], out...), nil
150+
return append(in[:header.MarshalSize()], out...), nil
150151
}
151152

152153
func generateAEADAdditionalData(h *recordlayer.Header, payloadLen int) []byte {

pkg/crypto/ciphersuite/gcm_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func FuzzGCM_RoundTrip(f *testing.F) {
5151

5252
var parsedHdr recordlayer.Header
5353
require.NoError(t, parsedHdr.Unmarshal(dec))
54-
got := dec[parsedHdr.Size():]
54+
got := dec[parsedHdr.MarshalSize():]
5555

5656
require.Equal(t, plain, got)
5757
})
@@ -117,7 +117,7 @@ func FuzzGCM_Bidirectional_RoundTrip(f *testing.F) {
117117
var parsedHdrA recordlayer.Header
118118
require.NoError(t, parsedHdrA.Unmarshal(decAonB))
119119

120-
gotA := decAonB[parsedHdrA.Size():]
120+
gotA := decAonB[parsedHdrA.MarshalSize():]
121121
require.Equal(t, pA, gotA)
122122

123123
// B -> A
@@ -144,7 +144,7 @@ func FuzzGCM_Bidirectional_RoundTrip(f *testing.F) {
144144
var parsedHdrB recordlayer.Header
145145
require.NoError(t, parsedHdrB.Unmarshal(decBonA))
146146

147-
gotB := decBonA[parsedHdrB.Size():]
147+
gotB := decBonA[parsedHdrB.MarshalSize():]
148148
require.Equal(t, pB, gotB)
149149
})
150150
}

pkg/protocol/alert/alert.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,28 +145,28 @@ func (a Alert) ContentType() protocol.ContentType {
145145
return protocol.ContentTypeAlert
146146
}
147147

148-
// Size returns the minimal buffer size required for MarshalInto.
149-
func (a Alert) Size() int {
148+
// MarshalSize returns the minimal buffer size required for MarshalTo.
149+
func (a Alert) MarshalSize() int {
150150
return 2
151151
}
152152

153153
// Marshal returns the encoded alert.
154154
func (a *Alert) Marshal() ([]byte, error) {
155-
out := make([]byte, a.Size())
156-
err := a.MarshalInto(out)
155+
out := make([]byte, a.MarshalSize())
156+
_, err := a.MarshalTo(out)
157157

158158
return out, err
159159
}
160160

161-
// MarshalInto returns the encoded alert.
162-
func (a *Alert) MarshalInto(out []byte) error {
163-
if len(out) < a.Size() {
164-
return errBufferTooSmall
161+
// MarshalTo returns the encoded alert.
162+
func (a *Alert) MarshalTo(out []byte) (int, error) {
163+
if len(out) < a.MarshalSize() {
164+
return 0, errBufferTooSmall
165165
}
166166
out[0] = byte(a.Level)
167167
out[1] = byte(a.Description)
168168

169-
return nil
169+
return 2, nil
170170
}
171171

172172
// Unmarshal populates the alert from binary data.

pkg/protocol/application_data.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,20 @@ func (a ApplicationData) ContentType() ContentType {
2020
// Marshal encodes the ApplicationData to binary.
2121
func (a *ApplicationData) Marshal() ([]byte, error) {
2222
out := make([]byte, len(a.Data))
23-
err := a.MarshalInto(out)
23+
_, err := a.MarshalTo(out)
2424

2525
return out, err
2626
}
2727

28-
// MarshalInto encodes the ApplicationData to binary into a pre-allocated buffer.
29-
func (a *ApplicationData) MarshalInto(out []byte) error {
28+
// MarshalTo encodes the ApplicationData to binary into a pre-allocated buffer.
29+
func (a *ApplicationData) MarshalTo(out []byte) (int, error) {
3030
copy(out, a.Data)
3131

32-
return nil
32+
return len(a.Data), nil
3333
}
3434

35-
// Size returns the size required for MarshalInto.
36-
func (a ApplicationData) Size() int {
35+
// MarshalSize returns the size required for MarshalTo.
36+
func (a ApplicationData) MarshalSize() int {
3737
return len(a.Data)
3838
}
3939

pkg/protocol/change_cipher_spec.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,27 @@ func (c ChangeCipherSpec) ContentType() ContentType {
1515
return ContentTypeChangeCipherSpec
1616
}
1717

18-
// Size returns the minimal buffer size required for MarshalInto.
19-
func (c ChangeCipherSpec) Size() int {
18+
// MarshalSize returns the minimal buffer size required for MarshalTo.
19+
func (c ChangeCipherSpec) MarshalSize() int {
2020
return 1
2121
}
2222

2323
// Marshal encodes the ChangeCipherSpec to binary.
2424
func (c *ChangeCipherSpec) Marshal() ([]byte, error) {
2525
out := make([]byte, 1)
26-
err := c.MarshalInto(out)
26+
_, err := c.MarshalTo(out)
2727

2828
return out, err
2929
}
3030

31-
// MarshalInto encodes the ChangeCipherSpec to binary into a pre-allocated buffer.
32-
func (c *ChangeCipherSpec) MarshalInto(out []byte) error {
33-
if len(out) < c.Size() {
34-
return errBufferTooSmall
31+
// MarshalTo encodes the ChangeCipherSpec to binary into a pre-allocated buffer.
32+
func (c *ChangeCipherSpec) MarshalTo(out []byte) (int, error) {
33+
if len(out) < c.MarshalSize() {
34+
return 0, errBufferTooSmall
3535
}
3636
out[0] = 0x01
3737

38-
return nil
38+
return 1, nil
3939
}
4040

4141
// Unmarshal populates the ChangeCipherSpec from binary.

pkg/protocol/content.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const (
2121
type Content interface {
2222
ContentType() ContentType
2323
Marshal() ([]byte, error)
24-
MarshalInto([]byte) error
24+
MarshalTo([]byte) (int, error)
2525
Unmarshal(data []byte) error
26-
Size() int
26+
MarshalSize() int
2727
}

0 commit comments

Comments
 (0)