24
24
25
25
use core:: prelude:: * ;
26
26
27
- use core :: uint ;
27
+ use digest :: Digest ;
28
28
29
29
/*
30
30
* A SHA-1 implementation derived from Paul E. Jones's reference
@@ -148,18 +148,17 @@ fn circular_shift(bits: u32, word: u32) -> u32 {
148
148
return word << bits | word >> 32u32 - bits;
149
149
}
150
150
151
- fn mk_result ( st : & mut Sha1 ) -> ~ [ u8 ] {
151
+ fn mk_result ( st : & mut Sha1 , rs : & mut [ u8 ] ) {
152
152
if !st. computed { pad_msg ( st) ; st. computed = true ; }
153
- let mut rs : ~ [ u8 ] = ~ [ ] ;
153
+ let mut i = 0 ;
154
154
for st. h. mut_iter( ) . advance |ptr_hpart| {
155
155
let hpart = * ptr_hpart;
156
- let a = ( hpart >> 24u32 & 0xFFu32 ) as u8;
157
- let b = ( hpart >> 16u32 & 0xFFu32 ) as u8;
158
- let c = ( hpart >> 8u32 & 0xFFu32 ) as u8;
159
- let d = ( hpart & 0xFFu32 ) as u8;
160
- rs = vec :: append ( copy rs , [ a , b , c , d ] ) ;
156
+ rs [ i ] = ( hpart >> 24u32 & 0xFFu32 ) as u8;
157
+ rs [ i+ 1 ] = ( hpart >> 16u32 & 0xFFu32 ) as u8;
158
+ rs [ i+ 2 ] = ( hpart >> 8u32 & 0xFFu32 ) as u8;
159
+ rs [ i+ 3 ] = ( hpart & 0xFFu32 ) as u8;
160
+ i += 4 ;
161
161
}
162
- return rs;
163
162
}
164
163
165
164
/*
@@ -221,6 +220,9 @@ impl Sha1 {
221
220
st. reset ( ) ;
222
221
return st;
223
222
}
223
+ }
224
+
225
+ impl Digest for Sha1 {
224
226
pub fn reset ( & mut self ) {
225
227
self . len_low = 0 ;
226
228
self . len_high = 0 ;
@@ -233,28 +235,15 @@ impl Sha1 {
233
235
self . computed = false ;
234
236
}
235
237
pub fn input ( & mut self , msg : & [ u8 ] ) { add_input ( self , msg) ; }
236
- pub fn input_str ( & mut self , msg : & str ) {
237
- add_input ( self , msg. as_bytes ( ) ) ;
238
- }
239
- pub fn result ( & mut self ) -> ~[ u8 ] { return mk_result ( self ) ; }
240
- pub fn result_str ( & mut self ) -> ~str {
241
- let rr = mk_result ( self ) ;
242
- let mut s = ~"";
243
- for rr. iter( ) . advance( ) |b| {
244
- let hex = uint:: to_str_radix( * b as uint , 16 u) ;
245
- if hex. len ( ) == 1 {
246
- s += "0" ;
247
- }
248
- s += hex;
249
- }
250
- return s;
251
- }
238
+ pub fn result ( & mut self , out : & mut [ u8 ] ) { return mk_result ( self , out) ; }
239
+ pub fn output_bits ( & self ) -> uint { 160 }
252
240
}
253
241
254
242
#[ cfg( test) ]
255
243
mod tests {
256
244
use core:: vec;
257
245
246
+ use digest:: { Digest , DigestUtil } ;
258
247
use sha1:: Sha1 ;
259
248
260
249
#[ test]
@@ -343,13 +332,15 @@ mod tests {
343
332
344
333
// Test that it works when accepting the message all at once
345
334
335
+ let mut out = [ 0u8 , ..20 ] ;
336
+
346
337
let mut sh = ~Sha1 :: new ( ) ;
347
338
for tests. iter( ) . advance |t| {
348
- sh . input_str( t. input) ;
349
- let out = sh. result( ) ;
339
+ ( * sh ) . input_str( t. input) ;
340
+ sh. result( out ) ;
350
341
assert ! ( vec:: eq( t. output, out) ) ;
351
342
352
- let out_str = sh . result_str ( ) ;
343
+ let out_str = ( * sh ) . result_str( ) ;
353
344
assert_eq ! ( out_str. len( ) , 40 ) ;
354
345
assert ! ( out_str == t. output_str) ;
355
346
@@ -363,13 +354,13 @@ mod tests {
363
354
let mut left = len;
364
355
while left > 0 u {
365
356
let take = ( left + 1 u) / 2 u;
366
- sh . input_str( t. input. slice( len - left, take + len - left) ) ;
357
+ ( * sh ) . input_str( t. input. slice( len - left, take + len - left) ) ;
367
358
left = left - take;
368
359
}
369
- let out = sh. result ( ) ;
360
+ sh. result( out ) ;
370
361
assert ! ( vec:: eq( t. output, out) ) ;
371
362
372
- let out_str = sh . result_str ( ) ;
363
+ let out_str = ( * sh ) . result_str ( ) ;
373
364
assert_eq ! ( out_str. len( ) , 40 ) ;
374
365
assert ! ( out_str == t. output_str) ;
375
366
0 commit comments