Utility functions to generate checksum based on 2's complement\r
algorithm.\r
\r
- Copyright (c) 2007 - 2008, Intel Corporation<BR>\r
- All rights reserved. This program and the accompanying materials\r
+ Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
+ http://opensource.org/licenses/bsd-license.php.\r
\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
If Buffer is NULL, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the sum operation.\r
+ @param Buffer The pointer to the buffer to carry out the sum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Sum The sum of Buffer with carry bits dropped during additions.\r
UINT8\r
EFIAPI\r
CalculateSum8 (\r
- IN CONST UINT8 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT8 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT8 Sum;\r
for (Sum = 0, Count = 0; Count < Length; Count++) {\r
Sum = (UINT8) (Sum + *(Buffer + Count));\r
}\r
- \r
+\r
return Sum;\r
}\r
\r
If Buffer is NULL, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the checksum operation.\r
+ @param Buffer The pointer to the buffer to carry out the checksum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Checksum The 2's complement checksum of Buffer.\r
UINT8\r
EFIAPI\r
CalculateCheckSum8 (\r
- IN CONST UINT8 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT8 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT8 CheckSum;\r
If Length is not aligned on a 16-bit boundary, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the sum operation.\r
+ @param Buffer The pointer to the buffer to carry out the sum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Sum The sum of Buffer with carry bits dropped during additions.\r
UINT16\r
EFIAPI\r
CalculateSum16 (\r
- IN CONST UINT16 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT16 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT16 Sum;\r
for (Sum = 0, Count = 0; Count < Total; Count++) {\r
Sum = (UINT16) (Sum + *(Buffer + Count));\r
}\r
- \r
+\r
return Sum;\r
}\r
\r
If Length is not aligned on a 16-bit boundary, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the checksum operation.\r
+ @param Buffer The pointer to the buffer to carry out the checksum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Checksum The 2's complement checksum of Buffer.\r
UINT16\r
EFIAPI\r
CalculateCheckSum16 (\r
- IN CONST UINT16 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT16 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT16 CheckSum;\r
If Length is not aligned on a 32-bit boundary, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the sum operation.\r
+ @param Buffer The pointer to the buffer to carry out the sum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Sum The sum of Buffer with carry bits dropped during additions.\r
UINT32\r
EFIAPI\r
CalculateSum32 (\r
- IN CONST UINT32 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT32 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT32 Sum;\r
for (Sum = 0, Count = 0; Count < Total; Count++) {\r
Sum = Sum + *(Buffer + Count);\r
}\r
- \r
+\r
return Sum;\r
}\r
\r
If Length is not aligned on a 32-bit boundary, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the checksum operation.\r
+ @param Buffer The pointer to the buffer to carry out the checksum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Checksum The 2's complement checksum of Buffer.\r
UINT32\r
EFIAPI\r
CalculateCheckSum32 (\r
- IN CONST UINT32 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT32 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT32 CheckSum;\r
If Length is not aligned on a 64-bit boundary, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the sum operation.\r
+ @param Buffer The pointer to the buffer to carry out the sum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Sum The sum of Buffer with carry bits dropped during additions.\r
UINT64\r
EFIAPI\r
CalculateSum64 (\r
- IN CONST UINT64 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT64 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT64 Sum;\r
for (Sum = 0, Count = 0; Count < Total; Count++) {\r
Sum = Sum + *(Buffer + Count);\r
}\r
- \r
+\r
return Sum;\r
}\r
\r
If Length is not aligned on a 64-bit boundary, then ASSERT().\r
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
\r
- @param Buffer Pointer to the buffer to carry out the checksum operation.\r
+ @param Buffer The pointer to the buffer to carry out the checksum operation.\r
@param Length The size, in bytes, of Buffer.\r
\r
@return Checksum The 2's complement checksum of Buffer.\r
UINT64\r
EFIAPI\r
CalculateCheckSum64 (\r
- IN CONST UINT64 *Buffer,\r
- IN UINTN Length\r
+ IN CONST UINT64 *Buffer,\r
+ IN UINTN Length\r
)\r
{\r
UINT64 CheckSum;\r
return (UINT64) ((UINT64)(-1) - CheckSum + 1);\r
}\r
\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT32 mCrcTable[256] = {\r
+ 0x00000000,\r
+ 0x77073096,\r
+ 0xEE0E612C,\r
+ 0x990951BA,\r
+ 0x076DC419,\r
+ 0x706AF48F,\r
+ 0xE963A535,\r
+ 0x9E6495A3,\r
+ 0x0EDB8832,\r
+ 0x79DCB8A4,\r
+ 0xE0D5E91E,\r
+ 0x97D2D988,\r
+ 0x09B64C2B,\r
+ 0x7EB17CBD,\r
+ 0xE7B82D07,\r
+ 0x90BF1D91,\r
+ 0x1DB71064,\r
+ 0x6AB020F2,\r
+ 0xF3B97148,\r
+ 0x84BE41DE,\r
+ 0x1ADAD47D,\r
+ 0x6DDDE4EB,\r
+ 0xF4D4B551,\r
+ 0x83D385C7,\r
+ 0x136C9856,\r
+ 0x646BA8C0,\r
+ 0xFD62F97A,\r
+ 0x8A65C9EC,\r
+ 0x14015C4F,\r
+ 0x63066CD9,\r
+ 0xFA0F3D63,\r
+ 0x8D080DF5,\r
+ 0x3B6E20C8,\r
+ 0x4C69105E,\r
+ 0xD56041E4,\r
+ 0xA2677172,\r
+ 0x3C03E4D1,\r
+ 0x4B04D447,\r
+ 0xD20D85FD,\r
+ 0xA50AB56B,\r
+ 0x35B5A8FA,\r
+ 0x42B2986C,\r
+ 0xDBBBC9D6,\r
+ 0xACBCF940,\r
+ 0x32D86CE3,\r
+ 0x45DF5C75,\r
+ 0xDCD60DCF,\r
+ 0xABD13D59,\r
+ 0x26D930AC,\r
+ 0x51DE003A,\r
+ 0xC8D75180,\r
+ 0xBFD06116,\r
+ 0x21B4F4B5,\r
+ 0x56B3C423,\r
+ 0xCFBA9599,\r
+ 0xB8BDA50F,\r
+ 0x2802B89E,\r
+ 0x5F058808,\r
+ 0xC60CD9B2,\r
+ 0xB10BE924,\r
+ 0x2F6F7C87,\r
+ 0x58684C11,\r
+ 0xC1611DAB,\r
+ 0xB6662D3D,\r
+ 0x76DC4190,\r
+ 0x01DB7106,\r
+ 0x98D220BC,\r
+ 0xEFD5102A,\r
+ 0x71B18589,\r
+ 0x06B6B51F,\r
+ 0x9FBFE4A5,\r
+ 0xE8B8D433,\r
+ 0x7807C9A2,\r
+ 0x0F00F934,\r
+ 0x9609A88E,\r
+ 0xE10E9818,\r
+ 0x7F6A0DBB,\r
+ 0x086D3D2D,\r
+ 0x91646C97,\r
+ 0xE6635C01,\r
+ 0x6B6B51F4,\r
+ 0x1C6C6162,\r
+ 0x856530D8,\r
+ 0xF262004E,\r
+ 0x6C0695ED,\r
+ 0x1B01A57B,\r
+ 0x8208F4C1,\r
+ 0xF50FC457,\r
+ 0x65B0D9C6,\r
+ 0x12B7E950,\r
+ 0x8BBEB8EA,\r
+ 0xFCB9887C,\r
+ 0x62DD1DDF,\r
+ 0x15DA2D49,\r
+ 0x8CD37CF3,\r
+ 0xFBD44C65,\r
+ 0x4DB26158,\r
+ 0x3AB551CE,\r
+ 0xA3BC0074,\r
+ 0xD4BB30E2,\r
+ 0x4ADFA541,\r
+ 0x3DD895D7,\r
+ 0xA4D1C46D,\r
+ 0xD3D6F4FB,\r
+ 0x4369E96A,\r
+ 0x346ED9FC,\r
+ 0xAD678846,\r
+ 0xDA60B8D0,\r
+ 0x44042D73,\r
+ 0x33031DE5,\r
+ 0xAA0A4C5F,\r
+ 0xDD0D7CC9,\r
+ 0x5005713C,\r
+ 0x270241AA,\r
+ 0xBE0B1010,\r
+ 0xC90C2086,\r
+ 0x5768B525,\r
+ 0x206F85B3,\r
+ 0xB966D409,\r
+ 0xCE61E49F,\r
+ 0x5EDEF90E,\r
+ 0x29D9C998,\r
+ 0xB0D09822,\r
+ 0xC7D7A8B4,\r
+ 0x59B33D17,\r
+ 0x2EB40D81,\r
+ 0xB7BD5C3B,\r
+ 0xC0BA6CAD,\r
+ 0xEDB88320,\r
+ 0x9ABFB3B6,\r
+ 0x03B6E20C,\r
+ 0x74B1D29A,\r
+ 0xEAD54739,\r
+ 0x9DD277AF,\r
+ 0x04DB2615,\r
+ 0x73DC1683,\r
+ 0xE3630B12,\r
+ 0x94643B84,\r
+ 0x0D6D6A3E,\r
+ 0x7A6A5AA8,\r
+ 0xE40ECF0B,\r
+ 0x9309FF9D,\r
+ 0x0A00AE27,\r
+ 0x7D079EB1,\r
+ 0xF00F9344,\r
+ 0x8708A3D2,\r
+ 0x1E01F268,\r
+ 0x6906C2FE,\r
+ 0xF762575D,\r
+ 0x806567CB,\r
+ 0x196C3671,\r
+ 0x6E6B06E7,\r
+ 0xFED41B76,\r
+ 0x89D32BE0,\r
+ 0x10DA7A5A,\r
+ 0x67DD4ACC,\r
+ 0xF9B9DF6F,\r
+ 0x8EBEEFF9,\r
+ 0x17B7BE43,\r
+ 0x60B08ED5,\r
+ 0xD6D6A3E8,\r
+ 0xA1D1937E,\r
+ 0x38D8C2C4,\r
+ 0x4FDFF252,\r
+ 0xD1BB67F1,\r
+ 0xA6BC5767,\r
+ 0x3FB506DD,\r
+ 0x48B2364B,\r
+ 0xD80D2BDA,\r
+ 0xAF0A1B4C,\r
+ 0x36034AF6,\r
+ 0x41047A60,\r
+ 0xDF60EFC3,\r
+ 0xA867DF55,\r
+ 0x316E8EEF,\r
+ 0x4669BE79,\r
+ 0xCB61B38C,\r
+ 0xBC66831A,\r
+ 0x256FD2A0,\r
+ 0x5268E236,\r
+ 0xCC0C7795,\r
+ 0xBB0B4703,\r
+ 0x220216B9,\r
+ 0x5505262F,\r
+ 0xC5BA3BBE,\r
+ 0xB2BD0B28,\r
+ 0x2BB45A92,\r
+ 0x5CB36A04,\r
+ 0xC2D7FFA7,\r
+ 0xB5D0CF31,\r
+ 0x2CD99E8B,\r
+ 0x5BDEAE1D,\r
+ 0x9B64C2B0,\r
+ 0xEC63F226,\r
+ 0x756AA39C,\r
+ 0x026D930A,\r
+ 0x9C0906A9,\r
+ 0xEB0E363F,\r
+ 0x72076785,\r
+ 0x05005713,\r
+ 0x95BF4A82,\r
+ 0xE2B87A14,\r
+ 0x7BB12BAE,\r
+ 0x0CB61B38,\r
+ 0x92D28E9B,\r
+ 0xE5D5BE0D,\r
+ 0x7CDCEFB7,\r
+ 0x0BDBDF21,\r
+ 0x86D3D2D4,\r
+ 0xF1D4E242,\r
+ 0x68DDB3F8,\r
+ 0x1FDA836E,\r
+ 0x81BE16CD,\r
+ 0xF6B9265B,\r
+ 0x6FB077E1,\r
+ 0x18B74777,\r
+ 0x88085AE6,\r
+ 0xFF0F6A70,\r
+ 0x66063BCA,\r
+ 0x11010B5C,\r
+ 0x8F659EFF,\r
+ 0xF862AE69,\r
+ 0x616BFFD3,\r
+ 0x166CCF45,\r
+ 0xA00AE278,\r
+ 0xD70DD2EE,\r
+ 0x4E048354,\r
+ 0x3903B3C2,\r
+ 0xA7672661,\r
+ 0xD06016F7,\r
+ 0x4969474D,\r
+ 0x3E6E77DB,\r
+ 0xAED16A4A,\r
+ 0xD9D65ADC,\r
+ 0x40DF0B66,\r
+ 0x37D83BF0,\r
+ 0xA9BCAE53,\r
+ 0xDEBB9EC5,\r
+ 0x47B2CF7F,\r
+ 0x30B5FFE9,\r
+ 0xBDBDF21C,\r
+ 0xCABAC28A,\r
+ 0x53B39330,\r
+ 0x24B4A3A6,\r
+ 0xBAD03605,\r
+ 0xCDD70693,\r
+ 0x54DE5729,\r
+ 0x23D967BF,\r
+ 0xB3667A2E,\r
+ 0xC4614AB8,\r
+ 0x5D681B02,\r
+ 0x2A6F2B94,\r
+ 0xB40BBE37,\r
+ 0xC30C8EA1,\r
+ 0x5A05DF1B,\r
+ 0x2D02EF8D\r
+};\r
\r
+/**\r
+ Computes and returns a 32-bit CRC for a data buffer.\r
+ CRC32 value bases on ITU-T V.42.\r
+\r
+ If Buffer is NULL, then ASSERT().\r
+ If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+ @param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed.\r
+ @param[in] Length The number of bytes in the buffer Data.\r
+\r
+ @retval Crc32 The 32-bit CRC was computed for the data buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCrc32(\r
+ IN VOID *Buffer,\r
+ IN UINTN Length\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT32 Crc;\r
+ UINT8 *Ptr;\r
+\r
+ ASSERT (Buffer != NULL);\r
+ ASSERT (Length <= (MAX_ADDRESS - ((UINTN) Buffer) + 1));\r
+\r
+ //\r
+ // Compute CRC\r
+ //\r
+ Crc = 0xffffffff;\r
+ for (Index = 0, Ptr = Buffer; Index < Length; Index++, Ptr++) {\r
+ Crc = (Crc >> 8) ^ mCrcTable[(UINT8) Crc ^ *Ptr];\r
+ }\r
+\r
+ return Crc ^ 0xffffffff;\r
+}\r