Home | History | Annotate | Line # | Download | only in lib
crc.c revision 1.1.1.1.6.2
      1  1.1.1.1.6.2  yamt /*	$NetBSD: crc.c,v 1.1.1.1.6.2 2014/05/22 11:40:58 yamt Exp $	*/
      2  1.1.1.1.6.2  yamt 
      3  1.1.1.1.6.2  yamt /*++
      4  1.1.1.1.6.2  yamt 
      5  1.1.1.1.6.2  yamt Copyright (c) 1998  Intel Corporation
      6  1.1.1.1.6.2  yamt 
      7  1.1.1.1.6.2  yamt Module Name:
      8  1.1.1.1.6.2  yamt 
      9  1.1.1.1.6.2  yamt     crc.c
     10  1.1.1.1.6.2  yamt 
     11  1.1.1.1.6.2  yamt Abstract:
     12  1.1.1.1.6.2  yamt 
     13  1.1.1.1.6.2  yamt     CRC32 functions
     14  1.1.1.1.6.2  yamt 
     15  1.1.1.1.6.2  yamt 
     16  1.1.1.1.6.2  yamt 
     17  1.1.1.1.6.2  yamt Revision History
     18  1.1.1.1.6.2  yamt 
     19  1.1.1.1.6.2  yamt --*/
     20  1.1.1.1.6.2  yamt 
     21  1.1.1.1.6.2  yamt #include "lib.h"
     22  1.1.1.1.6.2  yamt 
     23  1.1.1.1.6.2  yamt 
     24  1.1.1.1.6.2  yamt UINT32 CRCTable[256] = {
     25  1.1.1.1.6.2  yamt     0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
     26  1.1.1.1.6.2  yamt     0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
     27  1.1.1.1.6.2  yamt     0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
     28  1.1.1.1.6.2  yamt     0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
     29  1.1.1.1.6.2  yamt     0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
     30  1.1.1.1.6.2  yamt     0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
     31  1.1.1.1.6.2  yamt     0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
     32  1.1.1.1.6.2  yamt     0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
     33  1.1.1.1.6.2  yamt     0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
     34  1.1.1.1.6.2  yamt     0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
     35  1.1.1.1.6.2  yamt     0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
     36  1.1.1.1.6.2  yamt     0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
     37  1.1.1.1.6.2  yamt     0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
     38  1.1.1.1.6.2  yamt     0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
     39  1.1.1.1.6.2  yamt     0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
     40  1.1.1.1.6.2  yamt     0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
     41  1.1.1.1.6.2  yamt     0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
     42  1.1.1.1.6.2  yamt     0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
     43  1.1.1.1.6.2  yamt     0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
     44  1.1.1.1.6.2  yamt     0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
     45  1.1.1.1.6.2  yamt     0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
     46  1.1.1.1.6.2  yamt     0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
     47  1.1.1.1.6.2  yamt     0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
     48  1.1.1.1.6.2  yamt     0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
     49  1.1.1.1.6.2  yamt     0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
     50  1.1.1.1.6.2  yamt     0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
     51  1.1.1.1.6.2  yamt     0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
     52  1.1.1.1.6.2  yamt     0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
     53  1.1.1.1.6.2  yamt     0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
     54  1.1.1.1.6.2  yamt     0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
     55  1.1.1.1.6.2  yamt     0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
     56  1.1.1.1.6.2  yamt     0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
     57  1.1.1.1.6.2  yamt     0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
     58  1.1.1.1.6.2  yamt     0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
     59  1.1.1.1.6.2  yamt     0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
     60  1.1.1.1.6.2  yamt     0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
     61  1.1.1.1.6.2  yamt     0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
     62  1.1.1.1.6.2  yamt     0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
     63  1.1.1.1.6.2  yamt     0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
     64  1.1.1.1.6.2  yamt     0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
     65  1.1.1.1.6.2  yamt     0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
     66  1.1.1.1.6.2  yamt     0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
     67  1.1.1.1.6.2  yamt     0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
     68  1.1.1.1.6.2  yamt     };
     69  1.1.1.1.6.2  yamt 
     70  1.1.1.1.6.2  yamt 
     71  1.1.1.1.6.2  yamt 
     72  1.1.1.1.6.2  yamt VOID
     73  1.1.1.1.6.2  yamt SetCrc (
     74  1.1.1.1.6.2  yamt     IN OUT EFI_TABLE_HEADER *Hdr
     75  1.1.1.1.6.2  yamt     )
     76  1.1.1.1.6.2  yamt /*++
     77  1.1.1.1.6.2  yamt 
     78  1.1.1.1.6.2  yamt Routine Description:
     79  1.1.1.1.6.2  yamt 
     80  1.1.1.1.6.2  yamt     Updates the CRC32 value in the table header
     81  1.1.1.1.6.2  yamt 
     82  1.1.1.1.6.2  yamt Arguments:
     83  1.1.1.1.6.2  yamt 
     84  1.1.1.1.6.2  yamt     Hdr     - The table to update
     85  1.1.1.1.6.2  yamt 
     86  1.1.1.1.6.2  yamt Returns:
     87  1.1.1.1.6.2  yamt 
     88  1.1.1.1.6.2  yamt     None
     89  1.1.1.1.6.2  yamt 
     90  1.1.1.1.6.2  yamt --*/
     91  1.1.1.1.6.2  yamt {
     92  1.1.1.1.6.2  yamt     SetCrcAltSize (Hdr->HeaderSize, Hdr);
     93  1.1.1.1.6.2  yamt }
     94  1.1.1.1.6.2  yamt 
     95  1.1.1.1.6.2  yamt VOID
     96  1.1.1.1.6.2  yamt SetCrcAltSize (
     97  1.1.1.1.6.2  yamt     IN UINTN                 Size,
     98  1.1.1.1.6.2  yamt     IN OUT EFI_TABLE_HEADER *Hdr
     99  1.1.1.1.6.2  yamt     )
    100  1.1.1.1.6.2  yamt /*++
    101  1.1.1.1.6.2  yamt 
    102  1.1.1.1.6.2  yamt Routine Description:
    103  1.1.1.1.6.2  yamt 
    104  1.1.1.1.6.2  yamt     Updates the CRC32 value in the table header
    105  1.1.1.1.6.2  yamt 
    106  1.1.1.1.6.2  yamt Arguments:
    107  1.1.1.1.6.2  yamt 
    108  1.1.1.1.6.2  yamt     Hdr     - The table to update
    109  1.1.1.1.6.2  yamt 
    110  1.1.1.1.6.2  yamt Returns:
    111  1.1.1.1.6.2  yamt 
    112  1.1.1.1.6.2  yamt     None
    113  1.1.1.1.6.2  yamt 
    114  1.1.1.1.6.2  yamt --*/
    115  1.1.1.1.6.2  yamt {
    116  1.1.1.1.6.2  yamt     Hdr->CRC32 = 0;
    117  1.1.1.1.6.2  yamt     Hdr->CRC32 = CalculateCrc((UINT8 *)Hdr, Size);
    118  1.1.1.1.6.2  yamt }
    119  1.1.1.1.6.2  yamt 
    120  1.1.1.1.6.2  yamt 
    121  1.1.1.1.6.2  yamt BOOLEAN
    122  1.1.1.1.6.2  yamt CheckCrc (
    123  1.1.1.1.6.2  yamt     IN UINTN                 MaxSize,
    124  1.1.1.1.6.2  yamt     IN OUT EFI_TABLE_HEADER *Hdr
    125  1.1.1.1.6.2  yamt     )
    126  1.1.1.1.6.2  yamt /*++
    127  1.1.1.1.6.2  yamt 
    128  1.1.1.1.6.2  yamt Routine Description:
    129  1.1.1.1.6.2  yamt 
    130  1.1.1.1.6.2  yamt     Checks the CRC32 value in the table header
    131  1.1.1.1.6.2  yamt 
    132  1.1.1.1.6.2  yamt Arguments:
    133  1.1.1.1.6.2  yamt 
    134  1.1.1.1.6.2  yamt     Hdr     - The table to check
    135  1.1.1.1.6.2  yamt 
    136  1.1.1.1.6.2  yamt Returns:
    137  1.1.1.1.6.2  yamt 
    138  1.1.1.1.6.2  yamt     TRUE if the CRC is OK in the table
    139  1.1.1.1.6.2  yamt 
    140  1.1.1.1.6.2  yamt --*/
    141  1.1.1.1.6.2  yamt {
    142  1.1.1.1.6.2  yamt     return CheckCrcAltSize (MaxSize, Hdr->HeaderSize, Hdr);
    143  1.1.1.1.6.2  yamt }
    144  1.1.1.1.6.2  yamt 
    145  1.1.1.1.6.2  yamt 
    146  1.1.1.1.6.2  yamt 
    147  1.1.1.1.6.2  yamt 
    148  1.1.1.1.6.2  yamt BOOLEAN
    149  1.1.1.1.6.2  yamt CheckCrcAltSize (
    150  1.1.1.1.6.2  yamt     IN UINTN                 MaxSize,
    151  1.1.1.1.6.2  yamt     IN UINTN                 Size,
    152  1.1.1.1.6.2  yamt     IN OUT EFI_TABLE_HEADER *Hdr
    153  1.1.1.1.6.2  yamt     )
    154  1.1.1.1.6.2  yamt /*++
    155  1.1.1.1.6.2  yamt 
    156  1.1.1.1.6.2  yamt Routine Description:
    157  1.1.1.1.6.2  yamt 
    158  1.1.1.1.6.2  yamt     Checks the CRC32 value in the table header
    159  1.1.1.1.6.2  yamt 
    160  1.1.1.1.6.2  yamt Arguments:
    161  1.1.1.1.6.2  yamt 
    162  1.1.1.1.6.2  yamt     Hdr     - The table to check
    163  1.1.1.1.6.2  yamt 
    164  1.1.1.1.6.2  yamt Returns:
    165  1.1.1.1.6.2  yamt 
    166  1.1.1.1.6.2  yamt     TRUE if the CRC is OK in the table
    167  1.1.1.1.6.2  yamt 
    168  1.1.1.1.6.2  yamt --*/
    169  1.1.1.1.6.2  yamt {
    170  1.1.1.1.6.2  yamt     UINT32      Crc;
    171  1.1.1.1.6.2  yamt     UINT32      OrgCrc;
    172  1.1.1.1.6.2  yamt     BOOLEAN     f;
    173  1.1.1.1.6.2  yamt 
    174  1.1.1.1.6.2  yamt     if (Size == 0) {
    175  1.1.1.1.6.2  yamt         //
    176  1.1.1.1.6.2  yamt         // If header size is 0 CRC will pass so return FALSE here
    177  1.1.1.1.6.2  yamt         //
    178  1.1.1.1.6.2  yamt         return FALSE;
    179  1.1.1.1.6.2  yamt     }
    180  1.1.1.1.6.2  yamt     if (MaxSize && Size > MaxSize) {
    181  1.1.1.1.6.2  yamt         DEBUG((D_ERROR, "CheckCrc32: Size > MaxSize\n"));
    182  1.1.1.1.6.2  yamt         return FALSE;
    183  1.1.1.1.6.2  yamt     }
    184  1.1.1.1.6.2  yamt 
    185  1.1.1.1.6.2  yamt     // clear old crc from header
    186  1.1.1.1.6.2  yamt     OrgCrc = Hdr->CRC32;
    187  1.1.1.1.6.2  yamt     Hdr->CRC32 = 0;
    188  1.1.1.1.6.2  yamt     Crc = CalculateCrc((UINT8 *)Hdr, Size);
    189  1.1.1.1.6.2  yamt 
    190  1.1.1.1.6.2  yamt     // set restults
    191  1.1.1.1.6.2  yamt     Hdr->CRC32 = OrgCrc;
    192  1.1.1.1.6.2  yamt 
    193  1.1.1.1.6.2  yamt     // return status
    194  1.1.1.1.6.2  yamt     f = OrgCrc == (UINT32) Crc;
    195  1.1.1.1.6.2  yamt     if (!f) {
    196  1.1.1.1.6.2  yamt         DEBUG((D_ERROR, "CheckCrc32: Crc check failed\n"));
    197  1.1.1.1.6.2  yamt     }
    198  1.1.1.1.6.2  yamt 
    199  1.1.1.1.6.2  yamt     return f;
    200  1.1.1.1.6.2  yamt }
    201  1.1.1.1.6.2  yamt 
    202  1.1.1.1.6.2  yamt 
    203  1.1.1.1.6.2  yamt UINT32
    204  1.1.1.1.6.2  yamt CalculateCrc (
    205  1.1.1.1.6.2  yamt     UINT8 *pt,
    206  1.1.1.1.6.2  yamt     UINTN Size
    207  1.1.1.1.6.2  yamt     )
    208  1.1.1.1.6.2  yamt {
    209  1.1.1.1.6.2  yamt     UINTN Crc;
    210  1.1.1.1.6.2  yamt 
    211  1.1.1.1.6.2  yamt     // compute crc
    212  1.1.1.1.6.2  yamt     Crc = 0xffffffff;
    213  1.1.1.1.6.2  yamt     while (Size) {
    214  1.1.1.1.6.2  yamt         Crc = (Crc >> 8) ^ CRCTable[(UINT8) Crc ^ *pt];
    215  1.1.1.1.6.2  yamt         pt += 1;
    216  1.1.1.1.6.2  yamt         Size -= 1;
    217  1.1.1.1.6.2  yamt     }
    218  1.1.1.1.6.2  yamt     Crc = Crc ^ 0xffffffff;
    219  1.1.1.1.6.2  yamt     return (UINT32)Crc;
    220  1.1.1.1.6.2  yamt }
    221