Skip to content

Commit ddb5b69

Browse files
authored
fix #284
1 parent d009f7e commit ddb5b69

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

zuc/eea.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,16 @@ func (c *eea) XORKeyStream(dst, src []byte) {
7878
return
7979
}
8080
}
81-
words := (len(src) + WordSize - 1) / WordSize
82-
rounds := words / RoundWords
8381
var keyBytes [RoundBytes]byte
84-
for i := 0; i < rounds; i++ {
82+
for len(src) >= RoundBytes {
8583
genKeyStreamRev32(keyBytes[:], &c.zucState32)
8684
subtle.XORBytes(dst, src, keyBytes[:])
8785
dst = dst[RoundBytes:]
8886
src = src[RoundBytes:]
8987
}
90-
if processedWords := rounds * RoundWords; processedWords < words {
91-
byteLen := WordSize * (words - processedWords)
88+
if len(src) > 0 {
89+
words := (len(src) + WordSize - 1) / WordSize
90+
byteLen := WordSize * words
9291
genKeyStreamRev32(keyBytes[:byteLen], &c.zucState32)
9392
n := subtle.XORBytes(dst, src, keyBytes[:])
9493
// save remaining key bytes

zuc/eea_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,28 @@ func TestXORStreamAt(t *testing.T) {
160160
})
161161
}
162162

163+
func TestIssue284(t *testing.T) {
164+
key, err := hex.DecodeString(zucEEATests[0].key)
165+
if err != nil {
166+
t.Error(err)
167+
}
168+
c, err := NewEEACipher(key, zucEEATests[0].count, zucEEATests[0].bearer, zucEEATests[0].direction)
169+
if err != nil {
170+
t.Error(err)
171+
}
172+
src := make([]byte, 200)
173+
expected := make([]byte, 200)
174+
dst := make([]byte, 200)
175+
c.XORKeyStream(expected, src)
176+
177+
for i := 124; i <= 200; i++ {
178+
c.XORKeyStreamAt(dst, src[:i], 0)
179+
if !bytes.Equal(expected[:i], dst[:i]) {
180+
t.Fatalf("failed for len %v", i)
181+
}
182+
}
183+
}
184+
163185
func benchmarkStream(b *testing.B, buf []byte) {
164186
b.SetBytes(int64(len(buf)))
165187

0 commit comments

Comments
 (0)