3
3
package packet
4
4
5
5
import (
6
- "bytes"
7
6
"crypto/cipher"
8
7
"encoding/binary"
9
8
"io"
@@ -59,20 +58,22 @@ func (wo *aeadCrypter) incrementIndex() error {
59
58
// aeadDecrypter reads and decrypts bytes. It buffers extra decrypted bytes when
60
59
// necessary, similar to aeadEncrypter.
61
60
type aeadDecrypter struct {
62
- aeadCrypter // Embedded ciphertext opener
63
- reader io.Reader // 'reader' is a partialLengthReader
61
+ aeadCrypter // Embedded ciphertext opener
62
+ reader io.Reader // 'reader' is a partialLengthReader
64
63
chunkBytes []byte
65
- peekedBytes []byte // Used to detect last chunk
66
- buffer bytes. Buffer // Buffered decrypted bytes
64
+ peekedBytes []byte // Used to detect last chunk
65
+ buffer [] byte // Buffered decrypted bytes
67
66
}
68
67
69
68
// Read decrypts bytes and reads them into dst. It decrypts when necessary and
70
69
// buffers extra decrypted bytes. It returns the number of bytes copied into dst
71
70
// and an error.
72
71
func (ar * aeadDecrypter ) Read (dst []byte ) (n int , err error ) {
73
72
// Return buffered plaintext bytes from previous calls
74
- if ar .buffer .Len () > 0 {
75
- return ar .buffer .Read (dst )
73
+ if len (ar .buffer ) > 0 {
74
+ n = copy (dst , ar .buffer )
75
+ ar .buffer = ar .buffer [n :]
76
+ return
76
77
}
77
78
78
79
// Read a chunk
@@ -92,12 +93,8 @@ func (ar *aeadDecrypter) Read(dst []byte) (n int, err error) {
92
93
}
93
94
94
95
// Return decrypted bytes, buffering if necessary
95
- if len (dst ) < len (decrypted ) {
96
- n = copy (dst , decrypted [:len (dst )])
97
- ar .buffer .Write (decrypted [len (dst ):])
98
- } else {
99
- n = copy (dst , decrypted )
100
- }
96
+ n = copy (dst , decrypted )
97
+ ar .buffer = decrypted [n :]
101
98
return
102
99
}
103
100
0 commit comments