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