@@ -118,35 +118,44 @@ CDoc2Reader::getLockForCert(const std::vector<uint8_t>& cert){
118118libcdoc::result_t
119119CDoc2Reader::getFMK (std::vector<uint8_t >& fmk, unsigned int lock_idx)
120120{
121+ if (lock_idx >= priv->locks .size ()) {
122+ setLastError (t_ (" Invalid lock index" ));
123+ LOG_ERROR (" {}" , last_error);
124+ return libcdoc::WRONG_ARGUMENTS;
125+ }
121126 LOG_DBG (" CDoc2Reader::getFMK: {}" , lock_idx);
122127 LOG_DBG (" CDoc2Reader::num locks: {}" , priv->locks .size ());
123128 const Lock& lock = priv->locks .at (lock_idx);
129+ LOG_DBG (" Label: {}" , lock.label );
124130 std::vector<uint8_t > kek;
125131 if (lock.type == Lock::Type::PASSWORD) {
126132 // Password
127133 LOG_DBG (" password" );
128134 std::string info_str = libcdoc::CDoc2::getSaltForExpand (lock.label );
135+ LOG_DBG (" info: {}" , toHex (info_str));
129136 std::vector<uint8_t > kek_pm;
130- crypto->extractHKDF (kek_pm, lock.getBytes (Lock::SALT), lock.getBytes (Lock::PW_SALT), lock.getInt (Lock::KDF_ITER), lock_idx);
131- LOG_DBG (" password2" );
137+ if (auto rv = crypto->extractHKDF (kek_pm, lock.getBytes (Lock::SALT), lock.getBytes (Lock::PW_SALT), lock.getInt (Lock::KDF_ITER), lock_idx); rv != libcdoc::OK) {
138+ setLastError (crypto->getLastErrorStr (rv));
139+ LOG_ERROR (" {}" , last_error);
140+ return rv;
141+ }
142+ LOG_TRACE_KEY (" salt: {}" , lock.getBytes (Lock::SALT));
143+ LOG_TRACE_KEY (" kek_pm: {}" , kek_pm);
132144 kek = libcdoc::Crypto::expand (kek_pm, info_str, 32 );
133- if (kek.empty ()) return libcdoc::CRYPTO_ERROR;
134- LOG_DBG (" password3" );
135145 } else if (lock.type == Lock::Type::SYMMETRIC_KEY) {
136146 // Symmetric key
137147 LOG_DBG (" symmetric" );
138148 std::string info_str = libcdoc::CDoc2::getSaltForExpand (lock.label );
139- std::vector<uint8_t > kek_pm;
140- crypto->extractHKDF (kek_pm, lock.getBytes (Lock::SALT), {}, 0 , lock_idx);
141- kek = libcdoc::Crypto::expand (kek_pm, info_str, 32 );
142-
143- LOG_DBG (" Label: {}" , lock.label );
144149 LOG_DBG (" info: {}" , toHex (info_str));
150+ std::vector<uint8_t > kek_pm;
151+ if (auto rv = crypto->extractHKDF (kek_pm, lock.getBytes (Lock::SALT), {}, 0 , lock_idx); rv != libcdoc::OK) {
152+ setLastError (crypto->getLastErrorStr (rv));
153+ LOG_ERROR (" {}" , last_error);
154+ return rv;
155+ }
145156 LOG_TRACE_KEY (" salt: {}" , lock.getBytes (Lock::SALT));
146157 LOG_TRACE_KEY (" kek_pm: {}" , kek_pm);
147- LOG_TRACE_KEY (" kek: {}" , kek);
148-
149- if (kek.empty ()) return libcdoc::CRYPTO_ERROR;
158+ kek = libcdoc::Crypto::expand (kek_pm, info_str, 32 );
150159 } else if ((lock.type == Lock::Type::PUBLIC_KEY) || (lock.type == Lock::Type::SERVER)) {
151160 // Public/private key
152161 std::vector<uint8_t > key_material;
@@ -196,13 +205,9 @@ CDoc2Reader::getFMK(std::vector<uint8_t>& fmk, unsigned int lock_idx)
196205 LOG_ERROR (" {}" , last_error);
197206 return result;
198207 }
199-
200208 LOG_TRACE_KEY (" Key kekPm: {}" , kek_pm);
201-
202209 std::string info_str = libcdoc::CDoc2::getSaltForExpand (key_material, lock.getBytes (Lock::Params::RCPT_KEY));
203-
204210 LOG_DBG (" info: {}" , toHex (info_str));
205-
206211 kek = libcdoc::Crypto::expand (kek_pm, info_str, libcdoc::CDoc2::KEY_LEN);
207212 }
208213 } else if (lock.type == Lock::Type::SHARE_SERVER) {
@@ -312,7 +317,6 @@ CDoc2Reader::getFMK(std::vector<uint8_t>& fmk, unsigned int lock_idx)
312317
313318 LOG_TRACE_KEY (" KEK: {}" , kek);
314319
315-
316320 if (kek.empty ()) {
317321 setLastError (t_ (" Failed to derive KEK" ));
318322 LOG_ERROR (" {}" , last_error);
@@ -394,10 +398,10 @@ CDoc2Reader::beginDecryption(const std::vector<uint8_t>& fmk)
394398 std::vector<uint8_t > aad (libcdoc::CDoc2::PAYLOAD.cbegin (), libcdoc::CDoc2::PAYLOAD.cend ());
395399 aad.insert (aad.end (), priv->header_data .cbegin (), priv->header_data .cend ());
396400 aad.insert (aad.end (), priv->headerHMAC .cbegin (), priv->headerHMAC .cend ());
397- if (priv->dec ->updateAAD (aad) != OK) {
398- setLastError (" Wrong decryption key (FMK) " );
401+ if (auto rv = priv->dec ->updateAAD (aad); rv != OK) {
402+ setLastError (priv-> dec -> getLastErrorStr (rv) );
399403 LOG_ERROR (" {}" , last_error);
400- return libcdoc::WRONG_KEY ;
404+ return rv ;
401405 }
402406
403407 priv->zsrc = std::make_unique<libcdoc::ZSource>(priv->dec .get (), false );
0 commit comments