aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/base32
diff options
context:
space:
mode:
authorGustav Westling <zegl@westling.xyz>2017-07-06 20:30:26 +0200
committerBrad Fitzpatrick <bradfitz@golang.org>2017-07-06 21:16:45 +0000
commitd1340ee2e91a873d689cf11b74022f60476cd729 (patch)
treebae70dfe4e9dea0cc3daa5f0682ee481435c8603 /src/encoding/base32
parent23ae7a70f9f28fe34547d2857e5efa789625052a (diff)
downloadgo-d1340ee2e91a873d689cf11b74022f60476cd729.tar.xz
encoding/base32: make NoPadding Encoding's DecodedLen return exact size
CL 47341 added support for decoding non-padded messages. But DecodedLen still returned a multiple of 5 for messages without a padding, even though it is possible to calculate the len exactly when using NoPadding. This change makes DecodedLen return the exact number of bytes that will be written. A change to the decoding logic is also made so that it can handle this case. DecodedLen now has the same behaviour as DecodedLen in encoding/base64. Fixes #20854 Change-Id: I729e0b1c0946c866fb675c854f835f366dd4b5a4 Reviewed-on: https://go-review.googlesource.com/47710 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/encoding/base32')
-rw-r--r--src/encoding/base32/base32.go9
-rw-r--r--src/encoding/base32/base32_test.go10
2 files changed, 11 insertions, 8 deletions
diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go
index 0270e8f4d4..bf341b54f3 100644
--- a/src/encoding/base32/base32.go
+++ b/src/encoding/base32/base32.go
@@ -341,7 +341,11 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
case 2:
dst[0] = dbuf[0]<<3 | dbuf[1]>>2
}
- dst = dst[5:]
+
+ if !end {
+ dst = dst[5:]
+ }
+
switch dlen {
case 2:
n += 1
@@ -495,8 +499,7 @@ func NewDecoder(enc *Encoding, r io.Reader) io.Reader {
// corresponding to n bytes of base32-encoded data.
func (enc *Encoding) DecodedLen(n int) int {
if enc.padChar == NoPadding {
- // +6 represents the missing padding
- return (n + 6) / 8 * 5
+ return n * 5 / 8
}
return n / 8 * 5
diff --git a/src/encoding/base32/base32_test.go b/src/encoding/base32/base32_test.go
index 6fe292b476..56b229d15a 100644
--- a/src/encoding/base32/base32_test.go
+++ b/src/encoding/base32/base32_test.go
@@ -551,13 +551,13 @@ func TestEncodedDecodedLen(t *testing.T) {
}},
{"NoPadding", StdEncoding.WithPadding(NoPadding), []test{
{0, 0, 0},
- {1, 2, 5},
- {2, 4, 5},
+ {1, 2, 1},
+ {2, 4, 2},
{5, 8, 5},
- {6, 10, 10},
- {7, 12, 10},
+ {6, 10, 6},
+ {7, 12, 7},
{10, 16, 10},
- {11, 18, 15},
+ {11, 18, 11},
}},
} {
t.Run(test.name, func(t *testing.T) {