@@ -10,6 +10,7 @@ use core::ffi::{c_char, c_int, c_uchar, c_void};
10
10
use hmac:: { Hmac , Mac } ;
11
11
use pbkdf2:: pbkdf2_hmac;
12
12
use rand_core:: { OsRng , RngCore } ;
13
+ use sha1:: Sha1 ;
13
14
use sha2:: Sha512 ;
14
15
15
16
pub use signal_tokenizer;
@@ -70,6 +71,7 @@ extern "C" fn random(_ctx: *mut c_void, buf: *mut c_void, length: c_int) -> c_in
70
71
extern "C" fn get_hmac_sz ( _ctx : * mut c_void , algorithm : c_int ) -> c_int {
71
72
match algorithm {
72
73
SQLCIPHER_HMAC_SHA512 => 64 ,
74
+ SQLCIPHER_HMAC_SHA1 => 20 ,
73
75
_ => 0 ,
74
76
}
75
77
}
@@ -85,9 +87,6 @@ extern "C" fn hmac(
85
87
in2_sz : c_int ,
86
88
out : * mut c_uchar ,
87
89
) -> c_int {
88
- if algorithm != SQLCIPHER_HMAC_SHA512 {
89
- return SQLITE_ERROR ;
90
- }
91
90
if hmac_key. is_null ( ) || in1. is_null ( ) || out. is_null ( ) {
92
91
return SQLITE_ERROR ;
93
92
}
@@ -99,16 +98,34 @@ extern "C" fn hmac(
99
98
Some ( unsafe { core:: slice:: from_raw_parts ( in2 as * mut c_uchar , in2_sz as usize ) } )
100
99
} ;
101
100
102
- let Ok ( mut mac) = Hmac :: < Sha512 > :: new_from_slice ( key) else {
103
- return SQLITE_ERROR ;
104
- } ;
105
- mac. update ( in1) ;
106
- if let Some ( in2) = in2 {
107
- mac. update ( in2) ;
108
- }
109
- let digest = mac. finalize ( ) . into_bytes ( ) ;
110
- unsafe {
111
- out. copy_from ( digest. as_ptr ( ) , digest. len ( ) ) ;
101
+ match algorithm {
102
+ SQLCIPHER_HMAC_SHA512 => {
103
+ let Ok ( mut mac) = Hmac :: < Sha512 > :: new_from_slice ( key) else {
104
+ return SQLITE_ERROR ;
105
+ } ;
106
+ mac. update ( in1) ;
107
+ if let Some ( in2) = in2 {
108
+ mac. update ( in2) ;
109
+ }
110
+ let digest = mac. finalize ( ) . into_bytes ( ) ;
111
+ unsafe {
112
+ out. copy_from ( digest. as_ptr ( ) , digest. len ( ) ) ;
113
+ } ;
114
+ }
115
+ SQLCIPHER_HMAC_SHA1 => {
116
+ let Ok ( mut mac) = Hmac :: < Sha1 > :: new_from_slice ( key) else {
117
+ return SQLITE_ERROR ;
118
+ } ;
119
+ mac. update ( in1) ;
120
+ if let Some ( in2) = in2 {
121
+ mac. update ( in2) ;
122
+ }
123
+ let digest = mac. finalize ( ) . into_bytes ( ) ;
124
+ unsafe {
125
+ out. copy_from ( digest. as_ptr ( ) , digest. len ( ) ) ;
126
+ } ;
127
+ }
128
+ _ => return SQLITE_ERROR ,
112
129
} ;
113
130
SQLITE_OK
114
131
}
@@ -124,16 +141,21 @@ extern "C" fn pbkdf(
124
141
key_sz : c_int ,
125
142
key : * mut c_uchar ,
126
143
) -> c_int {
127
- if algorithm != SQLCIPHER_PBKDF2_HMAC_SHA512 {
128
- return SQLITE_ERROR ;
129
- }
130
144
if pass. is_null ( ) || salt. is_null ( ) || key. is_null ( ) {
131
145
return SQLITE_ERROR ;
132
146
}
133
147
let password = unsafe { core:: slice:: from_raw_parts ( pass as * const c_uchar , pass_sz as usize ) } ;
134
148
let salt = unsafe { core:: slice:: from_raw_parts ( salt as * const c_uchar , salt_sz as usize ) } ;
135
149
let buf = unsafe { core:: slice:: from_raw_parts_mut ( key as * mut c_uchar , key_sz as usize ) } ;
136
- pbkdf2_hmac :: < Sha512 > ( password, salt, workfactor as u32 , buf) ;
150
+ match algorithm {
151
+ SQLCIPHER_PBKDF2_HMAC_SHA512 => {
152
+ pbkdf2_hmac :: < Sha512 > ( password, salt, workfactor as u32 , buf) ;
153
+ }
154
+ SQLCIPHER_PBKDF2_HMAC_SHA1 => {
155
+ pbkdf2_hmac :: < Sha1 > ( password, salt, workfactor as u32 , buf) ;
156
+ }
157
+ _ => return SQLITE_ERROR ,
158
+ } ;
137
159
SQLITE_OK
138
160
}
139
161
0 commit comments