@@ -102,13 +102,13 @@ namespace hmac_cpp {
102102 salt_block[salt_len + 2 ] = static_cast <uint8_t >((i >> 8 ) & 0xFF );
103103 salt_block[salt_len + 3 ] = static_cast <uint8_t >(i & 0xFF );
104104
105- secure_buffer<uint8_t > u (std::move (get_hmac (password_ptr, password_len,
106- salt_block.data (), salt_block.size (),
107- hash_type)));
108- secure_buffer<uint8_t > t = u;
105+ secure_buffer<uint8_t , true > u (std::move (get_hmac (password_ptr, password_len,
106+ salt_block.data (), salt_block.size (),
107+ hash_type)));
108+ secure_buffer<uint8_t , true > t = u;
109109 for (uint32_t j = 1 ; j < iterations; ++j) {
110- u = secure_buffer<uint8_t >(get_hmac (password_ptr, password_len,
111- u.data (), u.size (), hash_type));
110+ u = secure_buffer<uint8_t , true >(get_hmac (password_ptr, password_len,
111+ u.data (), u.size (), hash_type));
112112 for (size_t k = 0 ; k < t.size (); ++k) {
113113 t[k] ^= u[k];
114114 }
@@ -125,6 +125,20 @@ namespace hmac_cpp {
125125 return derived;
126126 }
127127
128+ secure_buffer<uint8_t , true > pbkdf2_secure (
129+ const void * password_ptr, size_t password_len,
130+ const void * salt_ptr, size_t salt_len,
131+ uint32_t iterations, size_t dk_len,
132+ Pbkdf2Hash prf) {
133+ auto derived = pbkdf2 (password_ptr, password_len,
134+ salt_ptr, salt_len,
135+ iterations, dk_len, prf);
136+ PageLockGuard lock (derived.data (), derived.size ());
137+ secure_buffer<uint8_t , true > out (std::move (derived));
138+ lock.locked = false ;
139+ return out;
140+ }
141+
128142 bool pbkdf2 (Pbkdf2Hash prf,
129143 const void * password_ptr, size_t password_len,
130144 const void * salt_ptr, size_t salt_len,
@@ -175,8 +189,8 @@ namespace hmac_cpp {
175189 salt_block[salt_len + 2 ] = static_cast <uint8_t >((i >> 8 ) & 0xFF );
176190 salt_block[salt_len + 3 ] = static_cast <uint8_t >(i & 0xFF );
177191
178- secure_buffer<uint8_t > u (hlen);
179- secure_buffer<uint8_t > t (hlen);
192+ secure_buffer<uint8_t , true > u (hlen);
193+ secure_buffer<uint8_t , true > t (hlen);
180194 HmacContext ctx (hash_type);
181195 ctx.init (password_ptr, password_len);
182196 ctx.update (salt_block.data (), salt_block.size ());
@@ -221,7 +235,7 @@ namespace hmac_cpp {
221235 Pbkdf2Hash prf) {
222236 TypeHash hash_type = to_type_hash (prf);
223237 auto pwd_prime = get_hmac (pepper_ptr, pepper_len, password_ptr, password_len, hash_type);
224- secure_buffer<uint8_t > tmp (std::move (pwd_prime));
238+ secure_buffer<uint8_t , true > tmp (std::move (pwd_prime));
225239 auto dk = pbkdf2 (tmp.data (), tmp.size (), salt_ptr, salt_len, iterations, dk_len, prf);
226240 secure_zero (tmp.data (), tmp.size ());
227241 return dk;
0 commit comments