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