aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/cipher/ctr.go
diff options
context:
space:
mode:
authorCaleb Spare <cespare@gmail.com>2015-10-18 15:45:36 -0700
committerAdam Langley <agl@golang.org>2015-10-20 21:38:36 +0000
commit2bf91afd2bef0e95229da4f6d42e5ffc9aee85a9 (patch)
tree6a9d356ff4f9d57243fe91efead6f82affa2ebd5 /src/crypto/cipher/ctr.go
parent55ecda4ffd1899463db19bf224106fd73de21898 (diff)
downloadgo-2bf91afd2bef0e95229da4f6d42e5ffc9aee85a9.tar.xz
crypto/cipher: fix CTR infinite loop with large block sizes
Additionally, add a test for CTR mode to cover a range of block sizes. Fixes #12975 Change-Id: I458aac1616228747e62f92f823768d55e874877a Reviewed-on: https://go-review.googlesource.com/16050 Reviewed-by: Adam Langley <agl@golang.org>
Diffstat (limited to 'src/crypto/cipher/ctr.go')
-rw-r--r--src/crypto/cipher/ctr.go5
1 files changed, 1 insertions, 4 deletions
diff --git a/src/crypto/cipher/ctr.go b/src/crypto/cipher/ctr.go
index 70ac40f6a7..16baa6d17d 100644
--- a/src/crypto/cipher/ctr.go
+++ b/src/crypto/cipher/ctr.go
@@ -41,13 +41,10 @@ func NewCTR(block Block, iv []byte) Stream {
func (x *ctr) refill() {
remain := len(x.out) - x.outUsed
- if remain > x.outUsed {
- return
- }
copy(x.out, x.out[x.outUsed:])
x.out = x.out[:cap(x.out)]
bs := x.b.BlockSize()
- for remain < len(x.out)-bs {
+ for remain <= len(x.out)-bs {
x.b.Encrypt(x.out[remain:], x.ctr)
remain += bs