@@ -70,7 +70,7 @@ pub struct ChaCha<R: Rounds, MC: MaxCounter> {
70
70
buffer : Buffer ,
71
71
72
72
/// Position within buffer, or `None` if the buffer is not in use
73
- buffer_pos : u8 ,
73
+ buffer_pos : u16 ,
74
74
75
75
/// Current counter value relative to the start of the keystream
76
76
counter : u64 ,
@@ -121,23 +121,23 @@ impl<R: Rounds, MC: MaxCounter> StreamCipher for ChaCha<R, MC> {
121
121
if data. len ( ) < BUFFER_SIZE - pos {
122
122
let n = pos + data. len ( ) ;
123
123
xor ( data, & self . buffer [ pos..n] ) ;
124
- self . buffer_pos = n as u8 ;
124
+ self . buffer_pos = n as u16 ;
125
125
return Ok ( ( ) ) ;
126
126
} else {
127
127
let ( l, r) = data. split_at_mut ( BUFFER_SIZE - pos) ;
128
128
data = r;
129
129
if let Some ( new_ctr) = counter. checked_add ( COUNTER_INCR ) {
130
130
counter = new_ctr;
131
131
} else if data. is_empty ( ) {
132
- self . buffer_pos = BUFFER_SIZE as u8 ;
132
+ self . buffer_pos = BUFFER_SIZE as u16 ;
133
133
} else {
134
134
return Err ( LoopError ) ;
135
135
}
136
136
xor ( l, & self . buffer [ pos..] ) ;
137
137
}
138
138
}
139
139
140
- if self . buffer_pos == BUFFER_SIZE as u8 {
140
+ if self . buffer_pos == BUFFER_SIZE as u16 {
141
141
if data. is_empty ( ) {
142
142
return Ok ( ( ) ) ;
143
143
} else {
@@ -154,7 +154,7 @@ impl<R: Rounds, MC: MaxCounter> StreamCipher for ChaCha<R, MC> {
154
154
}
155
155
156
156
let rem = chunks. into_remainder ( ) ;
157
- self . buffer_pos = rem. len ( ) as u8 ;
157
+ self . buffer_pos = rem. len ( ) as u16 ;
158
158
self . counter = counter;
159
159
if !rem. is_empty ( ) {
160
160
self . generate_block ( counter) ;
@@ -168,24 +168,27 @@ impl<R: Rounds, MC: MaxCounter> StreamCipher for ChaCha<R, MC> {
168
168
impl < R : Rounds , MC : MaxCounter > StreamCipherSeek for ChaCha < R , MC > {
169
169
fn try_current_pos < T : SeekNum > ( & self ) -> Result < T , OverflowError > {
170
170
// quick and dirty fix, until ctr-like parallel block processing will be added
171
- let ( counter, pos) = if self . buffer_pos < BLOCK_SIZE as u8 {
172
- ( self . counter , self . buffer_pos )
173
- } else {
174
- (
175
- self . counter . checked_add ( 1 ) . ok_or ( OverflowError ) ?,
176
- self . buffer_pos - BLOCK_SIZE as u8 ,
177
- )
171
+ let ( counter, pos) = {
172
+ let mut counter = self . counter ;
173
+ let mut pos = self . buffer_pos ;
174
+
175
+ while pos >= BLOCK_SIZE as u16 {
176
+ counter = counter. checked_add ( 1 ) . ok_or ( OverflowError ) ?;
177
+ pos -= BLOCK_SIZE as u16 ;
178
+ }
179
+
180
+ ( counter, pos)
178
181
} ;
179
- T :: from_block_byte ( counter, pos, BLOCK_SIZE as u8 )
182
+ T :: from_block_byte ( counter, pos as u8 , BLOCK_SIZE as u8 )
180
183
}
181
184
182
185
fn try_seek < T : SeekNum > ( & mut self , pos : T ) -> Result < ( ) , LoopError > {
183
- let res: ( u64 , u8 ) = pos. to_block_byte ( BUFFER_SIZE as u8 ) ?;
186
+ let res: ( u64 , u8 ) = pos. to_block_byte ( BLOCK_SIZE as u8 ) ?;
184
187
let old_counter = self . counter ;
185
188
let old_buffer_pos = self . buffer_pos ;
186
189
187
- self . counter = res. 0 . checked_mul ( COUNTER_INCR ) . ok_or ( LoopError ) ? ;
188
- self . buffer_pos = res. 1 ;
190
+ self . counter = res. 0 ;
191
+ self . buffer_pos = res. 1 as u16 ;
189
192
190
193
if let Err ( e) = self . check_data_len ( & [ 0 ] ) {
191
194
self . counter = old_counter;
0 commit comments