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