1+ use std:: vec;
2+
13use crate :: logistic_map;
24use wasm_bindgen:: prelude:: * ;
35
@@ -21,18 +23,19 @@ pub fn inject_lsb(
2123 let msg_len_encode = ( msg_vec_raw. len ( ) as u32 ) . to_le_bytes ( ) ;
2224
2325 let mut msg_vec = vec ! [ 0 ; ( im. len( ) + 7 ) / 8 ] ;
24- console_log ! ( "Message channel length (encode): {}" , msg_vec. len( ) ) ;
25- if msg_vec. len ( ) < msg_len_encode. len ( ) + msg_vec_raw. len ( ) {
26+ let msg_len = msg_len_encode. len ( ) + msg_vec_raw. len ( ) ;
27+ console_log ! ( "[lsb encode] Capacity: {}, message length: {}" , msg_vec. len( ) , msg_len) ;
28+
29+ if msg_vec. len ( ) < msg_len {
2630 return Err ( "Channel capacity not enough for message" . to_string ( ) ) ;
2731 }
2832
29- // Copy the message length and raw message into the padded vector
30- for ( i, & byte) in msg_len_encode. iter ( ) . enumerate ( ) {
31- msg_vec[ i] = byte;
32- }
33- for ( i, & byte) in msg_vec_raw. iter ( ) . enumerate ( ) {
34- msg_vec[ i + msg_len_encode. len ( ) ] = byte;
35- }
33+ msg_len_encode. iter ( ) . enumerate ( ) . for_each (
34+ |( i, & byte) | { msg_vec[ i] = byte; }
35+ ) ;
36+ msg_vec_raw. iter ( ) . enumerate ( ) . for_each (
37+ |( i, & byte) | { msg_vec[ i + msg_len_encode. len ( ) ] = byte; }
38+ ) ;
3639
3740 if let Some ( seed) = encryption_seed {
3841 msg_vec = logistic_map:: encode :: < 1 > ( & msg_vec, seed) ;
@@ -42,36 +45,26 @@ pub fn inject_lsb(
4245 let msg_idx = i / 8 ;
4346 let bit_idx = i % 8 ;
4447
45- if msg_idx > msg_vec. len ( ) - 1 {
46- break ; // No more bits to inject
47- }
48+ // No more bits to inject
49+ if msg_idx > msg_vec. len ( ) - 1 { break ; }
4850
4951 let bit = ( msg_vec[ msg_idx] >> ( 7 - bit_idx) ) & 1 ;
5052 im[ i] = im[ i] & 0xFE | bit;
5153 }
52-
5354 Ok ( ( ) )
5455}
5556
5657pub fn extract_lsb (
5758 im : & [ u8 ] ,
5859 encryption_seed : Option < f64 > ,
5960) -> Result < String , String > {
60- if im. len ( ) < 8 {
61- return Err ( "Image too small to contain message" . to_string ( ) ) ;
62- }
61+ if im. len ( ) < 32 { return Err ( "Image too small to contain message" . to_string ( ) ) ; }
6362
64- let mut msg_bits = Vec :: new ( ) ;
65- for i in 0 ..im. len ( ) {
66- let bit = im[ i] & 1 ; // Extract the least significant bit
67- msg_bits. push ( bit) ;
68- }
69- let npad = msg_bits. len ( ) % 8 ;
70- if npad != 0 {
71- msg_bits. extend ( vec ! [ 0 ; 8 - npad] ) ;
72- }
63+ let npad = ( im. len ( ) + 7 ) / 8 * 8 - im. len ( ) ;
64+ let mut msg_bits: Vec < u8 > = im. iter ( ) . map ( |& byte| { 0x01 & byte } ) . collect ( ) ;
65+ msg_bits. extend ( vec ! [ 0 ; npad] ) ;
7366
74- let mut msg_vec = Vec :: new ( ) ;
67+ let mut msg_vec = Vec :: with_capacity ( msg_bits . len ( ) / 8 ) ;
7568 for i in ( 0 ..msg_bits. len ( ) ) . step_by ( 8 ) {
7669 let byte = msg_bits[ i..i + 8 ] . iter ( ) . fold ( 0 , |acc, & bit| ( acc << 1 ) | bit) ;
7770 msg_vec. push ( byte) ;
@@ -87,7 +80,6 @@ pub fn extract_lsb(
8780 console_err ! ( "Message length: {}, message channel length: {}" , msg_len, msg_vec. len( ) ) ;
8881 return Err ( "Failed to decode message" . to_string ( ) ) ;
8982 }
90-
9183 let msg_raw = & msg_vec[ 4 ..4 + msg_len as usize ] ;
9284
9385 String :: from_utf8 ( msg_raw. to_vec ( ) ) . map_err ( |e| e. to_string ( ) )
0 commit comments