| 174 | } |
| 175 | |
| 176 | td::Result<td::SecureString> MessageEncryption::decrypt_header(td::Slice encrypted_header, td::Slice encrypted_message, |
| 177 | td::Slice secret) { |
| 178 | if (encrypted_message.size() < 16) { |
| 179 | return td::Status::Error("Failed to decrypt: invalid message size"); |
| 180 | } |
| 181 | if (encrypted_header.size() != 32) { |
| 182 | return td::Status::Error("Failed to decrypt: invalid header size"); |
| 183 | } |
| 184 | |
| 185 | auto large_key = kdf_expand(secret, "tde2e_encrypt_header"); |
| 186 | auto encryption_key = large_key.as_slice().substr(0, 32); |
| 187 | |
| 188 | auto msg_id = encrypted_message.substr(0, 16); |
| 189 | auto cbc_state = calc_aes_cbc_state_from_hash(hmac_sha512(encryption_key, msg_id)); |
| 190 | |
| 191 | td::SecureString decrypted_header(32, 0); |
| 192 | cbc_state.decrypt(encrypted_header, decrypted_header.as_mutable_slice()); |
| 193 | return decrypted_header; |
| 194 | } |
| 195 | |
| 196 | } // namespace tde2e_core |