Thread: Cyclic Redundancy Check: disable

  1. #1
    Registered User
    Join Date
    Apr 2009
    Posts
    37

    Cyclic Redundancy Check: disable

    Does anyone know if it is possible to disable or fool a CRC?

    I am writing a program in C to interact with an LCD screen through a Serial Com Port on a WinXP machine.

    The issue is that the LCD manufacturers insist that the packets sent/received to/from the screen are checked by a CRC. My issue is that my available memory to store the Boot-State is very limited and if I could get rid of or reduce the size of) the CRC that would be great.

    Here is a snippet of the code:
    Code:
    word get_crc(ubyte *bufptr,word len,word seed)
      {
      //CRC lookup table to avoid bit-shifting loops.
      static const word crcLookupTable[256] =
        {0x00000,0x01189,0x02312,0x0329B,0x04624,0x057AD,0x06536,0x074BF,
         0x08C48,0x09DC1,0x0AF5A,0x0BED3,0x0CA6C,0x0DBE5,0x0E97E,0x0F8F7,
         0x01081,0x00108,0x03393,0x0221A,0x056A5,0x0472C,0x075B7,0x0643E,
         0x09CC9,0x08D40,0x0BFDB,0x0AE52,0x0DAED,0x0CB64,0x0F9FF,0x0E876,
         0x02102,0x0308B,0x00210,0x01399,0x06726,0x076AF,0x04434,0x055BD,
         0x0AD4A,0x0BCC3,0x08E58,0x09FD1,0x0EB6E,0x0FAE7,0x0C87C,0x0D9F5,
         0x03183,0x0200A,0x01291,0x00318,0x077A7,0x0662E,0x054B5,0x0453C,
         0x0BDCB,0x0AC42,0x09ED9,0x08F50,0x0FBEF,0x0EA66,0x0D8FD,0x0C974,
         0x04204,0x0538D,0x06116,0x0709F,0x00420,0x015A9,0x02732,0x036BB,
         0x0CE4C,0x0DFC5,0x0ED5E,0x0FCD7,0x08868,0x099E1,0x0AB7A,0x0BAF3,
         0x05285,0x0430C,0x07197,0x0601E,0x014A1,0x00528,0x037B3,0x0263A,
         0x0DECD,0x0CF44,0x0FDDF,0x0EC56,0x098E9,0x08960,0x0BBFB,0x0AA72,
         0x06306,0x0728F,0x04014,0x0519D,0x02522,0x034AB,0x00630,0x017B9,
         0x0EF4E,0x0FEC7,0x0CC5C,0x0DDD5,0x0A96A,0x0B8E3,0x08A78,0x09BF1,
         0x07387,0x0620E,0x05095,0x0411C,0x035A3,0x0242A,0x016B1,0x00738,
         0x0FFCF,0x0EE46,0x0DCDD,0x0CD54,0x0B9EB,0x0A862,0x09AF9,0x08B70,
         0x08408,0x09581,0x0A71A,0x0B693,0x0C22C,0x0D3A5,0x0E13E,0x0F0B7,
         0x00840,0x019C9,0x02B52,0x03ADB,0x04E64,0x05FED,0x06D76,0x07CFF,
         0x09489,0x08500,0x0B79B,0x0A612,0x0D2AD,0x0C324,0x0F1BF,0x0E036,
         0x018C1,0x00948,0x03BD3,0x02A5A,0x05EE5,0x04F6C,0x07DF7,0x06C7E,
         0x0A50A,0x0B483,0x08618,0x09791,0x0E32E,0x0F2A7,0x0C03C,0x0D1B5,
         0x02942,0x038CB,0x00A50,0x01BD9,0x06F66,0x07EEF,0x04C74,0x05DFD,
         0x0B58B,0x0A402,0x09699,0x08710,0x0F3AF,0x0E226,0x0D0BD,0x0C134,
         0x039C3,0x0284A,0x01AD1,0x00B58,0x07FE7,0x06E6E,0x05CF5,0x04D7C,
         0x0C60C,0x0D785,0x0E51E,0x0F497,0x08028,0x091A1,0x0A33A,0x0B2B3,
         0x04A44,0x05BCD,0x06956,0x078DF,0x00C60,0x01DE9,0x02F72,0x03EFB,
         0x0D68D,0x0C704,0x0F59F,0x0E416,0x090A9,0x08120,0x0B3BB,0x0A232,
         0x05AC5,0x04B4C,0x079D7,0x0685E,0x01CE1,0x00D68,0x03FF3,0x02E7A,
         0x0E70E,0x0F687,0x0C41C,0x0D595,0x0A12A,0x0B0A3,0x08238,0x093B1,
         0x06B46,0x07ACF,0x04854,0x059DD,0x02D62,0x03CEB,0x00E70,0x01FF9,
         0x0F78F,0x0E606,0x0D49D,0x0C514,0x0B1AB,0x0A022,0x092B9,0x08330,
         0x07BC7,0x06A4E,0x058D5,0x0495C,0x03DE3,0x02C6A,0x01EF1,0x00F78};
    
      //Initial CRC value is 0x0FFFF.
      register word
        newCrc;
      newCrc=seed;
      //This algorithim is based on the IrDA LAP example.
      while(len--)
      {
        newCrc = (newCrc >> 8) ^ crcLookupTable[(newCrc ^ *bufptr++) & 0xff];
    }
      //Make this crc match the one's complement that is sent in the packet.
      return(~newCrc);
      }
    I tried resucing it from a 256 lookup-table to a "1 lookup table" as follows:
    Code:
    word get_crc(ubyte *bufptr,word len,word seed)
      {
      //CRC lookup table to avoid bit-shifting loops.
      static const word crcLookupTable[1] =
        {0x00000};
    
      //Initial CRC value is 0x0FFFF.
      register word
        newCrc;
      newCrc=seed;
      //This algorithim is based on the IrDA LAP example.
      while(len--)
      {
        newCrc = (newCrc >> 8) ^ crcLookupTable[(newCrc ^ *bufptr++) & 0xff];
    }
      //Make this crc match the one's complement that is sent in the packet.
      return(~newCrc);
      }
    Does anyone have any ideas?

  2. #2
    ATH0 quzah's Avatar
    Join Date
    Oct 2001
    Posts
    14,826
    Why are you indexing anything here? The only spot you are allowed to look in your "array of one element", is array[0]. Anything else is illegal. Therefore, you shouldn't be using an array at all.


    Quzah.
    Hope is the first step on the road to disappointment.

  3. #3
    Registered User VirtualAce's Avatar
    Join Date
    Aug 2001
    Posts
    9,607
    If you are using the device correctly then it should come with a driver/API that will allow you to interact with it without having to hack it's security features.

  4. #4
    Officially An Architect brewbuck's Avatar
    Join Date
    Mar 2007
    Location
    Portland, OR
    Posts
    7,396
    Quote Originally Posted by Bubba View Post
    If you are using the device correctly then it should come with a driver/API that will allow you to interact with it without having to hack it's security features.
    Regardless of whether there is an API, the issue seems to be code size. The code size could probably be reduced by replacing that CRC table with an explicit computation (the values are derived from a polynomial, which could be evaluated directly -- it will be slower but it will take up less space)
    Code:
    //try
    //{
    	if (a) do { f( b); } while(1);
    	else   do { f(!b); } while(1);
    //}

  5. #5
    Registered User
    Join Date
    Apr 2009
    Posts
    37
    brewbuck,

    you are right. The issue is code size. If I could fool the CRC to think that it only has one element in the lookup table that would dramatically reduce its size. Or as you say to use an explicit computation. Would that reduce the size of the function? Do you know where I could find help with developning this solution?

    Thanks
    Sam

  6. #6
    Kernel hacker
    Join Date
    Jul 2007
    Location
    Farncombe, Surrey, England
    Posts
    15,677
    The actual CODE size will be slightly larger, but you will most certainly not use the 512 bytes of dataspace.

    If you have more data-space in RAM, then what you cold do is calculate the CRC table once.

    This looks like a good resource:
    http://www.digitalnemesis.com/info/c...c16/gentable.c

    --
    Mats
    Compilers can produce warnings - make the compiler programmers happy: Use them!
    Please don't PM me for help - and no, I don't do help over instant messengers.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. How can i check a directory for certain files?
    By patrioticpar883 in forum C++ Programming
    Replies: 13
    Last Post: 02-01-2008, 05:27 PM
  2. how to check input is decimal or not?
    By kalamram in forum C Programming
    Replies: 3
    Last Post: 08-31-2007, 07:07 PM
  3. Please check this loop
    By Daesom in forum C++ Programming
    Replies: 13
    Last Post: 11-02-2006, 01:52 AM
  4. Thank you so much...
    By ta1samail in forum C++ Programming
    Replies: 0
    Last Post: 10-10-2001, 08:49 PM
  5. check my code ( if statement, file existance )
    By Shadow in forum C Programming
    Replies: 1
    Last Post: 10-04-2001, 11:13 AM