toolsandutils/e32tools/elf2e32/source/checksum.cpp
changeset 0 83f4b4db085c
child 1 d4b442d23379
equal deleted inserted replaced
-1:000000000000 0:83f4b4db085c
       
     1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Implementation of the checksum for the elf2e32 tool
       
    15 // @internalComponent
       
    16 // @released
       
    17 // 
       
    18 //
       
    19 
       
    20 #include "checksum.h"
       
    21 #include "e32imagedefs.h"
       
    22 
       
    23 typedef unsigned long uint32;
       
    24 typedef unsigned short uint16;
       
    25 typedef unsigned char uint8;
       
    26 
       
    27 /**
       
    28 Checksum every other byte
       
    29 
       
    30 @param aPtr    A pointer to the start of the data to be checksummed. 
       
    31 
       
    32 @internalComponent
       
    33 @released
       
    34 */
       
    35 uint32 checkSum(const void *aPtr)
       
    36 {
       
    37 
       
    38 	const uint8 * pB=(const uint8 *)aPtr;
       
    39 	const uint8 * pE=pB+(KMaxCheckedUid*sizeof(TUid));
       
    40 	uint8 buf[(KMaxCheckedUid*sizeof(TUid))>>1];
       
    41 	uint8 * pT=(&buf[0]);
       
    42 	while (pB<pE)
       
    43 	{
       
    44 		*pT++=(*pB);
       
    45 		pB+=2;
       
    46 	}
       
    47 	unsigned short crc=0;
       
    48 	Crc(crc,&buf[0],(KMaxCheckedUid*sizeof(TUid))>>1);
       
    49 	return(crc);
       
    50 }
       
    51 
       
    52 //crc table
       
    53 static const uint32 crcTab[256] =
       
    54     {
       
    55 	0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,
       
    56 	0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,
       
    57 	0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462,
       
    58 	0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509,
       
    59 	0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,
       
    60 	0x46b4,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,0x48c4,0x58e5,
       
    61 	0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,
       
    62 	0x9969,0xa90a,0xb92b,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
       
    63 	0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,0x6ca6,0x7c87,0x4ce4,
       
    64 	0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,
       
    65 	0x8d68,0x9d49,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,0xff9f,
       
    66 	0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,0x9188,0x81a9,0xb1ca,0xa1eb,
       
    67 	0xd10c,0xc12d,0xf14e,0xe16f,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,
       
    68 	0x6067,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,0x02b1,0x1290,
       
    69 	0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,
       
    70 	0xe54f,0xd52c,0xc50d,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
       
    71 	0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,0x26d3,0x36f2,0x0691,
       
    72 	0x16b0,0x6657,0x7676,0x4615,0x5634,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,
       
    73 	0xb98a,0xa9ab,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,0xcb7d,
       
    74 	0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,0x4a75,0x5a54,0x6a37,0x7a16,
       
    75 	0x0af1,0x1ad0,0x2ab3,0x3a92,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,
       
    76 	0x8dc9,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,0xef1f,0xff3e,
       
    77 	0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,
       
    78 	0x3eb2,0x0ed1,0x1ef0
       
    79 };
       
    80 
       
    81 /**
       
    82 Performs a CCITT CRC checksum on the specified data.
       
    83 
       
    84 On return from this function, the referenced 16 bit integer contains the checksummed 
       
    85 value.
       
    86 
       
    87 @param aCrc    A reference to a 16 bit integer to contain the checksummed value. 
       
    88 @param aPtr    A pointer to the start of the data to be checksummed. 
       
    89 @param aLength The length of the data to be checksummed.
       
    90 @internalComponent
       
    91 @released
       
    92 */
       
    93 void Crc(unsigned short & aCrc,const void * aPtr,size_t aLength)
       
    94 {
       
    95 
       
    96 	const uint8 * pB=(const uint8 *)aPtr;
       
    97 	const uint8 * pE=pB+aLength;
       
    98 	uint32 crc=aCrc;
       
    99     while (pB<pE)
       
   100 		crc=(crc<<8)^crcTab[((crc>>8)^*pB++)&0xff];
       
   101 	aCrc=(unsigned short)crc;
       
   102 }
       
   103 
       
   104 //crc table
       
   105 static const uint32 CrcTab32[256] =
       
   106 	{
       
   107 	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
       
   108 	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
       
   109 	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
       
   110 	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
       
   111 	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
       
   112 	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
       
   113 	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
       
   114 	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
       
   115 	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
       
   116 	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
       
   117 	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
       
   118 	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
       
   119 	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
       
   120 	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
       
   121 	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
       
   122 	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
       
   123 	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
       
   124 	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
       
   125 	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
       
   126 	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
       
   127 	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
       
   128 	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
       
   129 	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
       
   130 	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
       
   131 	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
       
   132 	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
       
   133 	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
       
   134 	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
       
   135 	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
       
   136 	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
       
   137 	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
       
   138 	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
       
   139 	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
       
   140 	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
       
   141 	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
       
   142 	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
       
   143 	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
       
   144 	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
       
   145 	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
       
   146 	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
       
   147 	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
       
   148 	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
       
   149 	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
       
   150 	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
       
   151 	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
       
   152 	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
       
   153 	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
       
   154 	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
       
   155 	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
       
   156 	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
       
   157 	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
       
   158 	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
       
   159 	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
       
   160 	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
       
   161 	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
       
   162 	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
       
   163 	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
       
   164 	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
       
   165 	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
       
   166 	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
       
   167 	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
       
   168 	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
       
   169 	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
       
   170 	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
       
   171 	};
       
   172 
       
   173 /**
       
   174 Performs a CCITT CRC-32 checksum on the specified data.
       
   175 
       
   176 On return from this function, the referenced 32 bit integer contains the CRC
       
   177 value.
       
   178 
       
   179 @param aCrc		A reference to a 32 bit integer to contain the CRC value. 
       
   180 @param aPtr		A pointer to the start of the data to be checksummed. 
       
   181 @param aLength	The length of the data to be checksummed.
       
   182 @internalComponent
       
   183 @released
       
   184 */
       
   185 void Crc32(unsigned long & aCrc, const void * aPtr, size_t aLength)
       
   186 {
       
   187 	const uint8 * p = (const uint8 *)aPtr;
       
   188 	const uint8 * q = p + aLength;
       
   189 	unsigned long crc = aCrc;
       
   190 	while (p < q)
       
   191 		crc = (crc >> 8) ^ CrcTab32[(crc ^ *p++) & 0xff];
       
   192 	aCrc = crc;
       
   193 }
       
   194