MS-OXMSG specifies the use of CRC-32 checksums without enough details

Destruction Elemental 96 Reputation points
2021-10-02T00:55:41.093+00:00

(Going to quickly preface this by saying sorry if this is the wrong category, please point me to the right one if it is not there already)

I'm working on implementing parsing on .MSG files, and am currently looking at the specification in MS-OXMSG, and it specifies that for String Named Properties the Stream ID uses the CRC-32 of the Unicode name. However, I have been unable to find a combination of Unicode (a very broad definition) and CRC-32 algorithm that matches the results I have found for what they should be (using process of elimination I have deduced the correct Stream ID which contains a copy of what the CRC-32 should be).

Can someone please provide the details for the CRC-32 algorithm used as well as which form of Unicode (I.E. UTF-8, UTF-16LE, UTF-16BE, etc.) the name should be in before calculating the CRC-32 of it?

Exchange Server Open Specifications
Exchange Server Open Specifications
Exchange Server: A family of Microsoft client/server messaging and collaboration software.Open Specifications: Technical documents for protocols, computer languages, standards support, and data portability. The goal with Open Specifications is to help developers open new opportunities to interoperate with Windows, SQL, Office, and SharePoint.
5 questions
{count} votes

Accepted answer
  1. Destruction Elemental 96 Reputation points
    2021-10-31T23:43:11.98+00:00

    Thank you @Tom Jebo for providing the location for the information about the CRC. To be specific, when converting to Unicode it appears (based on my first every successful crc32 computation that matched what was found in the files) to be using the UTF-16-LE format to represent it and then using the CRC32 lookup table defined in [MS-OXRTFCP] 2.1.2.2.1 CRC Lookup Table.

    I do still believe this to be an oversight that this data was not specified in the section where it would be very relevant, but I can now finally begin implementing the necessary code for this.


0 additional answers

Sort by: Most helpful