| 243 | } |
| 244 | |
| 245 | static td::Result<size_t> parse_event_entry(td::Slice data, const EventLog& log, EventLogEntry& entry) { |
| 246 | auto orig = data; |
| 247 | |
| 248 | TRY_RESULT(reg_index, cut<uint32_t>(data)); |
| 249 | entry.rtmr_index = reg_index > 0 ? reg_index - 1 : 0; |
| 250 | |
| 251 | TRY_RESULT(event_type, cut<uint32_t>(data)); |
| 252 | entry.event_type = event_type; |
| 253 | |
| 254 | TRY_RESULT(digest_count, cut<uint32_t>(data)); |
| 255 | |
| 256 | for (uint32_t i = 0; i < digest_count; i++) { |
| 257 | TRY_RESULT(alg_id, cut<uint16_t>(data)); |
| 258 | |
| 259 | auto it = log.digest_sizes.find(alg_id); |
| 260 | size_t digest_size = it != log.digest_sizes.end() ? it->second : AlgorithmId::digest_size(alg_id); |
| 261 | if (digest_size == 0) { |
| 262 | return td::Status::Error("Unknown algorithm"); |
| 263 | } |
| 264 | |
| 265 | TRY_RESULT(digest, cut_bytes(data, digest_size)); |
| 266 | |
| 267 | if (entry.digest_raw.empty()) { |
| 268 | entry.algorithm_id = alg_id; |
| 269 | entry.digest_raw = digest.str(); |
| 270 | entry.digest_hex = td::buffer_to_hex(digest); |
| 271 | } |
| 272 | } |
| 273 | |
| 274 | TRY_RESULT(event_size, cut<uint32_t>(data)); |
| 275 | TRY_RESULT(event_data, cut_bytes(data, event_size)); |
| 276 | entry.event_data = event_data.str(); |
| 277 | |
| 278 | entry.length = orig.size() - data.size(); |
| 279 | entry.raw_data = orig.substr(0, entry.length).str(); |
| 280 | |
| 281 | return entry.length; |
| 282 | } |
| 283 | |
| 284 | // ============================================================================ |
| 285 | // EventLog Methods |
no test coverage detected