From 2bf91afd2bef0e95229da4f6d42e5ffc9aee85a9 Mon Sep 17 00:00:00 2001 From: Caleb Spare Date: Sun, 18 Oct 2015 15:45:36 -0700 Subject: 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 --- src/crypto/cipher/ctr.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/crypto/cipher/ctr.go') 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 -- cgit v1.3