elfconvert: calculate crc32 for application & model sections

Bug: 232811729

Change-Id: Ib8b69c972c90390dd2d3a631a991907c9626908d
diff --git a/misc/elfconvert/Cargo.toml b/misc/elfconvert/Cargo.toml
index 37899c7..1598e82 100644
--- a/misc/elfconvert/Cargo.toml
+++ b/misc/elfconvert/Cargo.toml
@@ -23,6 +23,7 @@
 thread_local = "=1.1.4"
 
 clap = { version = "3.2", features = [ "derive" ] }
+crc = { version = "1.4.0", default-features = false }
 log = { version = "0.4" }
 stderrlog = { version = "0.5" }
 xmas-elf = { path = "../../../../crates/xmas-elf" }
diff --git a/misc/elfconvert/src/convert.rs b/misc/elfconvert/src/convert.rs
index da47e93..6d9f25a 100644
--- a/misc/elfconvert/src/convert.rs
+++ b/misc/elfconvert/src/convert.rs
@@ -48,6 +48,8 @@
 use core::mem::size_of;
 use core::ptr;
 use core::slice;
+use crc::crc32;
+use crc::Hasher32;
 use log::*;
 use std::fs::File;
 use std::io::Seek;
@@ -251,12 +253,14 @@
                 msize
             );
 
+            let mut digest = crc32::Digest::new(crc32::IEEE);
+            digest.write(bytes);
             let section = SectionHeader::new(
                 seg.virtual_addr(),
                 flags,
                 entry,
                 align,
-                /*crc=*/ 0, // TODO(sleffler) calculate
+                digest.sum32(),
                 fsize,
                 msize,
             );
@@ -302,13 +306,14 @@
         }
 
         if let SegmentData::Undefined(bytes) = seg.get_data(elf)? {
-            // TODO(sleffler): calculate the CRC32 checksum for each section
+            let mut digest = crc32::Digest::new(crc32::IEEE);
+            digest.write(bytes);
             let header = SectionHeader::new(
                 seg.virtual_addr(),
                 flags,
                 entry,
                 align,
-                /*crc=*/ 0,
+                digest.sum32(),
                 fsize,
                 msize,
             );