I understand what you're doing, and it makes sense to me.
What you want to do, I think, is validate the outer zip after it's been written. I think you said you want to validate the contents of the inner zip, but without extracting those files to the filesystem.
To do this, open the outer zip for reading with ZipFile.Read(). There's just one ZipEntry in it, if I understand the situation correctly. Call
ZipEntry.OpenReader() on that entry, which gives you a readable stream. You can then
create a ZipInputStream around that read-only stream.
You also may be able to wrap the result of ZipEntry.OpenReader() in a BufferedStream, and call ZipFile.Read() on THAT.
You cannot succeed by calling ZipFile.Read() using the result of ZipEntry.OpenReader(), in order to read and validate the inner zip. This is because when the ZipFile class is used to read a zip file, it seeks around in
the file. It seeks to the end, reads some things, then seeks backwards, and so on. The result of ZipEntry.OpenReader(), though, is a read-forward-only stream. It doesn't support seeks. Using a BufferedStream basically just caches all
the inner zip data, and so once again Seek() will work. But be careful, this only works if the buffer size is as large as the entire inner zip file. Maybe impractical.
On the other hand, the ZipInputStream does support reading from a read-forward-only stream, so it can be used to validate the result of ZipEntry.OpenReader().
The interface you want to use on ZipInputStream is
GetNextEntry(); call that and then call ZipInputStream.Read() to read the de-compressed content of the entry in the inner zip. Do GetNextEntry + Read it in a loop to read all entries.
If you call ZipInputStream.Read() repeatedly until it returns 0 (implying no more data is available for the ZipEntry), the Read() method will automatically and transparently validate the CRC for the entry, and throw an exception if the CRC does not
match the expected value. If you do not call Read() until it returns 0, then the ZipInputStream.Read() method will not validate the CRC of the entry.
Therefore to validate the CRC of the entry, just call Read() into a small buffer (say 2k), repeatedly, until it returns 0.
Does this answer the question?
ps: I am interested in tracking down any problem with corruption, but to do it, I guess you realize I need a reproducible test case.
last thing: if you want to add an entry to a zip, and the entry is a small string, you can call AddEntry() and pass a System.String. For your "label" entry, you may find that option interesting.