11use  crate :: store; 
2- use  crypto:: { 
3-     aes, 
4-     pbkdf2, 
5-     sha1:: Sha1 , 
6-     hmac:: Hmac , 
7-     blockmodes:: NoPadding , 
8-     buffer:: { 
9-         RefReadBuffer , 
10-         RefWriteBuffer , 
11-     } , 
12- } ; 
132use  diesel:: prelude:: * ; 
143use  keyring:: Keyring ; 
4+ use  openssl:: { 
5+     hash, 
6+     pkcs5, 
7+     symm
8+ } ; 
159use  std:: collections:: HashMap ; 
1610
1711/// LeetCode Cookies Schema 
@@ -25,12 +19,6 @@ mod schema {
2519    } 
2620} 
2721
28- /// Fix LeetCode Cookie 
29- type  CookieValue  = [ u8 ;  1024 ] ; 
30- 
31- /// Fix Chrome PBKDF2 key 
32- type  ChromeKey  = [ u8 ;  16 ] ; 
33- 
3422/// Please make sure the order 
3523///  
3624/// The order between table and struct must be same. 
@@ -42,7 +30,7 @@ pub struct Cookies {
4230} 
4331
4432/// Get cookies from chrome storage 
45- pub  fn  cookies ( )  -> HashMap < String ,  Vec < u8 > >  { 
33+ pub  fn  cookies ( )  -> HashMap < String ,  String >  { 
4634    use  self :: schema:: cookies:: dsl:: * ; 
4735
4836    let  home = dirs:: home_dir ( ) . unwrap ( ) ; 
@@ -66,7 +54,7 @@ pub fn cookies() -> HashMap<String, Vec<u8>> {
6654        . load :: < Cookies > ( & conn) 
6755        . expect ( "Error loading cookies" ) ; 
6856
69-     let  mut  m:  HashMap < String ,  Vec < u8 > >  = HashMap :: new ( ) ; 
57+     let  mut  m:  HashMap < String ,  String >  = HashMap :: new ( ) ; 
7058    for  c in  res. to_owned ( )  { 
7159        if  ( 
7260            c. name  == "csrftoken" . to_string ( ) 
@@ -82,39 +70,44 @@ pub fn cookies() -> HashMap<String, Vec<u8>> {
8270
8371
8472/// Decode cookies from chrome 
85- fn  decode_cookies ( v :  Vec < u8 > )  -> Vec < u8 >  { 
73+ fn  decode_cookies ( v :  Vec < u8 > )  -> String  { 
8674    let  ring = Keyring :: new ( "Chrome Safe Storage" ,  "Chrome" ) ; 
8775    let  pass = ring. get_password ( ) . expect ( "Get Password failed" ) ; 
88-     let  mut  mac = Hmac :: new ( Sha1 :: new ( ) ,  pass. as_bytes ( ) ) ; 
89-     let  mut  key:  ChromeKey  = [ 0_u8 ;  16 ] ; 
9076
91-     pbkdf2:: pbkdf2 ( & mut  mac,  b"saltysalt" ,  1003 ,  & mut  key) ; 
77+     let  mut  key = [ 0_u8 ;  16 ] ; 
78+     pkcs5:: pbkdf2_hmac ( 
79+         & pass. as_bytes ( ) , 
80+         b"saltysalt" , 
81+         1003 , 
82+         hash:: MessageDigest :: sha1 ( ) , 
83+         & mut  key
84+     ) . expect ( "pbkdf2 hmac went error." ) ; 
85+     
9286    chrome_decrypt ( v,  key) 
9387} 
9488
9589
9690/// Decrypt chrome cookie value with aes-128-cbc 
97- fn  chrome_decrypt ( v :  Vec < u8 > ,  key :  [ u8 ; 16 ] )  -> Vec < u8 >  { 
98-     let  iv :   ChromeKey  =  [ 0_u8 ;   16 ] ; 
99-     let  mut  res :   CookieValue  =  [ 0_u8 ;   1024 ] ; 
100-     
101-     let   mut  decryptor = aes :: cbc_decryptor ( 
102-         aes :: KeySize :: KeySize128 , 
91+ fn  chrome_decrypt ( v :  Vec < u8 > ,  key :  [ u8 ; 16 ] )  -> String  { 
92+     // <space>: \u16 
93+     let  iv =  vec ! [ 32_u8 ;   16 ] ; 
94+     let   mut  decrypter = symm :: Crypter :: new ( 
95+         symm :: Cipher :: aes_128_cbc ( ) , 
96+         symm :: Mode :: Decrypt , 
10397        & key, 
104-         & iv, 
105-         NoPadding 
106-     ) ; 
107-     
108-     let  mut  v_buf = RefReadBuffer :: new ( & v[ 3 ..] ) ; 
109-     let  mut  r_buf = RefWriteBuffer :: new ( & mut  res) ; 
98+         Some ( & iv) 
99+     ) . unwrap ( ) ; 
110100
111-     decryptor. decrypt ( 
112-         & mut  v_buf,  & mut  r_buf,  true 
113-     ) . expect ( "Decrypt Cookies with aes-128-cbc failed" ) ; 
101+     
102+     let  data_len = v. len ( )  - 3 ; 
103+     let  block_size = symm:: Cipher :: aes_128_cbc ( ) . block_size ( ) ; 
104+     let  mut  plaintext = vec ! [ 0 ;  data_len + block_size] ; 
105+     
106+     decrypter. pad ( false ) ; 
114107
115-     std :: str :: from_utf8 ( & res ) 
116-          . expect ( "Failed to trime cookie bytes" ) 
117-          . trim_matches ( char :: from ( 0 ) ) 
118-          . as_bytes ( ) 
119-          . to_vec ( ) 
108+     let   mut  count = decrypter . update ( & v [ 3 .. ] ,   & mut  plaintext ) . unwrap ( ) ; 
109+     count += decrypter . finalize ( & mut  plaintext [ count.. ] ) . unwrap ( ) ; 
110+     plaintext . truncate ( count - block_size ) ; 
111+     
112+     String :: from_utf8_lossy ( & plaintext . to_vec ( ) ) . to_string ( ) 
120113} 
0 commit comments