1
1
// Public crates.
2
- use rc4:: KeyInit ;
3
- use rc4:: Rc4 ;
4
- use rc4:: StreamCipher ;
5
- use salsa20:: cipher:: KeyIvInit ;
6
- use salsa20:: Salsa20 ;
7
- use sha2:: Digest ;
8
- use sha2:: Sha256 ;
2
+ use rc4:: { KeyInit , Rc4 , StreamCipher } ;
3
+ use salsa20:: { cipher:: KeyIvInit , Salsa20 } ;
4
+ use sha2:: { Digest , Sha256 } ;
9
5
use siphasher:: sip:: SipHasher24 ;
10
6
use std:: hash:: Hasher ;
11
7
use suffix_array:: SuffixArray ;
@@ -51,12 +47,9 @@ const BRANCH_TABLE: [u32; 256] = [
51
47
52
48
// Calculate and return sha256 hash.
53
49
fn sha256_calc ( input : & [ u8 ] ) -> [ u8 ; 32 ] {
54
- let mut output: [ u8 ; 32 ] = [ 0 ; 32 ] ;
55
50
let mut hasher = Sha256 :: new ( ) ;
56
51
hasher. update ( input) ;
57
-
58
- output. copy_from_slice ( hasher. finalize ( ) . as_slice ( ) ) ;
59
- output
52
+ hasher. finalize ( ) . into ( )
60
53
}
61
54
62
55
// Encrypt and return salsa20 stream.
@@ -71,21 +64,17 @@ fn salsa20_calc(key: &[u8; 32]) -> [u8; 256] {
71
64
fn fnv1a_calc ( input : & [ u8 ] ) -> u64 {
72
65
let mut hasher = fnv:: FnvHasher :: default ( ) ;
73
66
hasher. write ( input) ;
74
- let output = hasher. finish ( ) ;
75
- output
67
+ hasher. finish ( )
76
68
}
77
69
78
70
// Calculate and return xxh64 hash.
79
71
fn xxh64_calc ( input : & [ u8 ] ) -> u64 {
80
- let output = xxhash_rust:: xxh64:: xxh64 ( input, 0 ) ;
81
- output
72
+ xxhash_rust:: xxh64:: xxh64 ( input, 0 )
82
73
}
83
74
84
75
// Calculate and return sip24 hash.
85
76
fn sip24_calc ( input : & [ u8 ] , k0 : u64 , k1 : u64 ) -> u64 {
86
- let hasher = SipHasher24 :: new_with_keys ( k0, k1) ;
87
- let output = hasher. hash ( input) ;
88
- output
77
+ SipHasher24 :: new_with_keys ( k0, k1) . hash ( input)
89
78
}
90
79
91
80
// The AstroBWTv3 calculation.
@@ -95,9 +84,7 @@ pub fn astrobwtv3_hash(input: &[u8]) -> [u8; 32] {
95
84
96
85
// Step 3: rc4.
97
86
let mut rc4 = Rc4 :: new ( & data. into ( ) ) ;
98
- let mut stream = data. to_vec ( ) ;
99
- rc4. apply_keystream ( & mut stream) ;
100
- data. copy_from_slice ( & stream) ;
87
+ rc4. apply_keystream ( & mut data) ;
101
88
102
89
// Step 4: fnv1a.
103
90
let mut lhash = fnv1a_calc ( & data) ;
@@ -146,13 +133,13 @@ pub fn astrobwtv3_hash(input: &[u8]) -> [u8; 32] {
146
133
tmp = tmp. wrapping_mul ( tmp) ; // *
147
134
}
148
135
0x03 => {
149
- tmp = tmp ^ data[ pos2 as usize ] ; // XOR
136
+ tmp ^= data[ pos2 as usize ] ; // XOR
150
137
}
151
138
0x04 => {
152
139
tmp = !tmp; // binary NOT operator
153
140
}
154
141
0x05 => {
155
- tmp = tmp & data[ pos2 as usize ] ; // AND
142
+ tmp &= data[ pos2 as usize ] ; // AND
156
143
}
157
144
0x06 => {
158
145
tmp = tmp. wrapping_shl ( ( tmp & 3 ) as u32 ) ; // shift left
@@ -190,13 +177,11 @@ pub fn astrobwtv3_hash(input: &[u8]) -> [u8; 32] {
190
177
}
191
178
}
192
179
data[ i as usize ] = tmp;
193
- if branch == 0 {
194
- if ( pos2 - pos1) % 2 == 1 {
195
- // Reverse.
196
- data[ pos1 as usize ] = data[ pos1 as usize ] . reverse_bits ( ) ;
197
- data[ pos2 as usize ] = data[ pos2 as usize ] . reverse_bits ( ) ;
198
- data. swap ( pos1 as usize , pos2 as usize ) ;
199
- }
180
+ if branch == 0 && ( pos2 - pos1) % 2 == 1 {
181
+ // Reverse.
182
+ data[ pos1 as usize ] = data[ pos1 as usize ] . reverse_bits ( ) ;
183
+ data[ pos2 as usize ] = data[ pos2 as usize ] . reverse_bits ( ) ;
184
+ data. swap ( pos1 as usize , pos2 as usize ) ;
200
185
}
201
186
if branch == 253 {
202
187
// More deviations.
@@ -230,12 +215,10 @@ pub fn astrobwtv3_hash(input: &[u8]) -> [u8; 32] {
230
215
lhash = sip24_calc ( & data[ ..pos2 as usize ] , tries, prev_lhash) ;
231
216
}
232
217
233
- // 25% probablility .
218
+ // 25% probability .
234
219
if dp_minus <= 0x40 {
235
220
// Do the rc4.
236
- stream = data. to_vec ( ) ;
237
- rc4. apply_keystream ( & mut stream) ;
238
- data. copy_from_slice ( & stream) ;
221
+ rc4. apply_keystream ( & mut data) ;
239
222
}
240
223
241
224
data[ 255 ] ^= data[ pos1 as usize ] ^ data[ pos2 as usize ] ;
@@ -250,8 +233,8 @@ pub fn astrobwtv3_hash(input: &[u8]) -> [u8; 32] {
250
233
}
251
234
252
235
// We may discard up to ~ 1KiB data from the stream to ensure that wide number of variants exists.
253
- let data_len =
254
- ( tries - 4 ) as u32 * 256 + ( ( ( data[ 253 ] as u64 ) << 8 | ( data[ 254 ] as u64 ) ) as u32 & 0x3ff ) ;
236
+ let data_len = ( tries - 4 ) as u32 * 256
237
+ + ( ( ( ( data[ 253 ] as u64 ) << 8 ) | ( data[ 254 ] as u64 ) ) as u32 & 0x3ff ) ;
255
238
256
239
// Step 6: build our suffix array.
257
240
let scratch_sa = SuffixArray :: new ( & scratch_data[ ..data_len as usize ] ) ;
0 commit comments