| 155 | } |
| 156 | |
| 157 | td::Result<td::SecureString> MessageEncryption::encrypt_header(td::Slice decrypted_header, td::Slice encrypted_message, |
| 158 | td::Slice secret) { |
| 159 | if (encrypted_message.size() < 16) { |
| 160 | return td::Status::Error("Failed to encrypt header: encrypted_message is too small"); |
| 161 | } |
| 162 | if (decrypted_header.size() != 32) { |
| 163 | return td::Status::Error("Failed to encrypt header: header must be 32 bytes"); |
| 164 | } |
| 165 | auto large_key = kdf_expand(secret, "tde2e_encrypt_header"); |
| 166 | auto encryption_key = large_key.as_slice().substr(0, 32); |
| 167 | |
| 168 | auto msg_id = encrypted_message.substr(0, 16); |
| 169 | auto cbc_state = calc_aes_cbc_state_from_hash(kdf_expand(encryption_key, msg_id)); |
| 170 | |
| 171 | td::SecureString encrypted_header(32, 0); |
| 172 | cbc_state.encrypt(decrypted_header, encrypted_header.as_mutable_slice()); |
| 173 | return encrypted_header; |
| 174 | } |
| 175 | |
| 176 | td::Result<td::SecureString> MessageEncryption::decrypt_header(td::Slice encrypted_header, td::Slice encrypted_message, |
| 177 | td::Slice secret) { |