Skip to content

Commit ea76827

Browse files
authored
feat(pbkdf2): lock sensitive buffers
Lock intermediate and output buffers using secure_buffer with page locking. Adds pbkdf2_secure wrapper.
1 parent b6a1e14 commit ea76827

2 files changed

Lines changed: 38 additions & 9 deletions

File tree

include/hmac_cpp/hmac_utils.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,21 @@ namespace hmac_cpp {
110110
uint32_t iterations, size_t dk_len,
111111
Pbkdf2Hash prf = Pbkdf2Hash::Sha256);
112112

113+
/// \brief Derives a key into a page-locked secure buffer using PBKDF2
114+
/// \param password_ptr Pointer to the password buffer
115+
/// \param password_len Length of the password in bytes
116+
/// \param salt_ptr Pointer to the salt buffer
117+
/// \param salt_len Length of the salt in bytes
118+
/// \param iterations Number of iterations, must be positive
119+
/// \param dk_len Desired length of the derived key in bytes, must be positive
120+
/// \param prf Hash function to use (SHA1, SHA256, SHA512)
121+
/// \return Derived key as a page-locked secure buffer
122+
HMAC_CPP_API secure_buffer<uint8_t, true> pbkdf2_secure(
123+
const void* password_ptr, size_t password_len,
124+
const void* salt_ptr, size_t salt_len,
125+
uint32_t iterations, size_t dk_len,
126+
Pbkdf2Hash prf = Pbkdf2Hash::Sha256);
127+
113128
/// \brief Derive key using PBKDF2 from vector-based password and salt.
114129
/// \tparam T Byte type; must be char or uint8_t.
115130
/// \param password Password bytes.

src/hmac_utils.cpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)