2424
2525use core:: prelude:: * ;
2626
27- use core :: uint ;
27+ use digest :: Digest ;
2828
2929/*
3030 * A SHA-1 implementation derived from Paul E. Jones's reference
@@ -148,18 +148,17 @@ fn circular_shift(bits: u32, word: u32) -> u32 {
148148 return word << bits | word >> 32u32 - bits;
149149}
150150
151- fn mk_result ( st : & mut Sha1 ) -> ~ [ u8 ] {
151+ fn mk_result ( st : & mut Sha1 , rs : & mut [ u8 ] ) {
152152 if !st. computed { pad_msg ( st) ; st. computed = true ; }
153- let mut rs : ~ [ u8 ] = ~ [ ] ;
153+ let mut i = 0 ;
154154 for st. h. mut_iter( ) . advance |ptr_hpart| {
155155 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 ;
161161 }
162- return rs;
163162}
164163
165164/*
@@ -221,6 +220,9 @@ impl Sha1 {
221220 st. reset ( ) ;
222221 return st;
223222 }
223+ }
224+
225+ impl Digest for Sha1 {
224226 pub fn reset ( & mut self ) {
225227 self . len_low = 0 ;
226228 self . len_high = 0 ;
@@ -233,28 +235,15 @@ impl Sha1 {
233235 self . computed = false ;
234236 }
235237 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 }
252240}
253241
254242#[ cfg( test) ]
255243mod tests {
256244 use core:: vec;
257245
246+ use digest:: { Digest , DigestUtil } ;
258247 use sha1:: Sha1 ;
259248
260249 #[ test]
@@ -343,13 +332,15 @@ mod tests {
343332
344333 // Test that it works when accepting the message all at once
345334
335+ let mut out = [ 0u8 , ..20 ] ;
336+
346337 let mut sh = ~Sha1 :: new ( ) ;
347338 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 ) ;
350341 assert ! ( vec:: eq( t. output, out) ) ;
351342
352- let out_str = sh . result_str ( ) ;
343+ let out_str = ( * sh ) . result_str( ) ;
353344 assert_eq ! ( out_str. len( ) , 40 ) ;
354345 assert ! ( out_str == t. output_str) ;
355346
@@ -363,13 +354,13 @@ mod tests {
363354 let mut left = len;
364355 while left > 0 u {
365356 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) ) ;
367358 left = left - take;
368359 }
369- let out = sh. result ( ) ;
360+ sh. result( out ) ;
370361 assert ! ( vec:: eq( t. output, out) ) ;
371362
372- let out_str = sh . result_str ( ) ;
363+ let out_str = ( * sh ) . result_str ( ) ;
373364 assert_eq ! ( out_str. len( ) , 40 ) ;
374365 assert ! ( out_str == t. output_str) ;
375366
0 commit comments