Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

ZrtpCrc32.cxx

Go to the documentation of this file.
00001 /* SCTP kernel reference Implementation
00002  * Copyright (c) 1999-2001 Motorola, Inc.
00003  * Copyright (c) 2001-2003 International Business Machines, Corp.
00004  *
00005  * SCTP Checksum functions
00006  *
00007  * The SCTP reference implementation is free software;
00008  * you can redistribute it and/or modify it under the terms of
00009  * the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2, or (at your option)
00011  * any later version.
00012  *
00013  * The SCTP reference implementation is distributed in the hope that it
00014  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
00015  *                 ************************
00016  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00017  * See the GNU General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU General Public License
00020  * along with GNU CC; see the file COPYING.  If not, write to
00021  * the Free Software Foundation, 59 Temple Place - Suite 330,
00022  * Boston, MA 02111-1307, USA.
00023  *
00024  * Please send any bug reports or fixes you make to the
00025  * email address(es):
00026  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
00027  *
00028  * Or submit a bug report through the following website:
00029  *    http://www.sf.net/projects/lksctp
00030  *
00031  * Written or modified by:
00032  *    Dinakaran Joseph
00033  *    Jon Grimm <jgrimm@us.ibm.com>
00034  *    Sridhar Samudrala <sri@us.ibm.com>
00035  *
00036  * Any bugs reported given to us we will try to fix... any fixes shared will
00037  * be incorporated into the next SCTP release.
00038  */
00039 
00040 /* The following code has been taken directly from
00041  * draft-ietf-tsvwg-sctpcsum-03.txt
00042  *
00043  * The code has now been modified by Werner.Dittmann@t-online.de for use 
00044  * inside the ZRTP implementation.
00045  */
00046 
00047 #include <stdio.h>
00048 #include <stdint.h>
00049 #include <libzrtpcpp/ZrtpCrc32.h>
00050 
00051 #define CRC32C_POLY 0x1EDC6F41
00052 #define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF])
00053 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00054 /* Copyright 2001, D. Otis.  Use this program, code or tables    */
00055 /* extracted from it, as desired without restriction.            */
00056 /*                                                               */
00057 /* 32 Bit Reflected CRC table generation for SCTP.               */
00058 /* To accommodate serial byte data being shifted out least       */
00059 /* significant bit first, the table's 32 bit words are reflected */
00060 /* which flips both byte and bit MS and LS positions.  The CRC   */
00061 /* is calculated MS bits first from the perspective of the serial*/
00062 /* stream.  The x^32 term is implied and the x^0 term may also   */
00063 /* be shown as +1.  The polynomial code used is 0x1EDC6F41.      */
00064 /* Castagnoli93                                                  */
00065 /* x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+x^19+x^18+x^14+x^13+  */
00066 /* x^11+x^10+x^9+x^8+x^6+x^0                                     */
00067 /* Guy Castagnoli Stefan Braeuer and Martin Herrman              */
00068 /* "Optimization of Cyclic Redundancy-Check Codes                */
00069 /* with 24 and 32 Parity Bits",                                  */
00070 /* IEEE Transactions on Communications, Vol.41, No.6, June 1993  */
00071 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00072 static const uint32_t crc_c[256] = {
00073     0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
00074     0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
00075     0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
00076     0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
00077     0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
00078     0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
00079     0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
00080     0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
00081     0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
00082     0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
00083     0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
00084     0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
00085     0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
00086     0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
00087     0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
00088     0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
00089     0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
00090     0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
00091     0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
00092     0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
00093     0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
00094     0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
00095     0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
00096     0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
00097     0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
00098     0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
00099     0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
00100     0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
00101     0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
00102     0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
00103     0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
00104     0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
00105     0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
00106     0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
00107     0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
00108     0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
00109     0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
00110     0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
00111     0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
00112     0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
00113     0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
00114     0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
00115     0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
00116     0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
00117     0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
00118     0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
00119     0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
00120     0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
00121     0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
00122     0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
00123     0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
00124     0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
00125     0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
00126     0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
00127     0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
00128     0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
00129     0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
00130     0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
00131     0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
00132     0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
00133     0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
00134     0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
00135     0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
00136     0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
00137 };
00138 
00139 
00140 bool zrtpCheckCksum(uint8_t *buffer, uint16_t length, uint32_t crc32)
00141 {
00142     uint32_t chksum = zrtpGenerateCksum(buffer, length);
00143     chksum = zrtpEndCksum(chksum);
00144     // fprintf(stderr, "Received crc %x, computed crc: %x\n", crc32, chksum);
00145     return (crc32 == chksum);
00146 }
00147 
00148 uint32_t zrtpGenerateCksum(uint8_t *buffer, uint16_t length)
00149 {
00150     uint32_t crc32 = ~(uint32_t) 0;
00151     uint32_t i;
00152 
00153     // fprintf(stderr, "Buffer %xl, length: %d\n", buffer, length);
00154     /* Calculate the CRC. */
00155     for (i = 0; i < length ; i++)
00156         CRC32C(crc32, buffer[i]);
00157 
00158     return crc32;
00159 }
00160 
00161 uint32_t zrtpEndCksum(uint32_t crc32)
00162 {
00163     uint32_t result;
00164     uint8_t byte0, byte1, byte2, byte3;
00165 
00166     result = ~crc32;
00167 
00168     /*  result  now holds the negated polynomial remainder;
00169      *  since the table and algorithm is "reflected" [williams95].
00170      *  That is,  result has the same value as if we mapped the message
00171      *  to a polyomial, computed the host-bit-order polynomial
00172      *  remainder, performed final negation, then did an end-for-end
00173      *  bit-reversal.
00174      *  Note that a 32-bit bit-reversal is identical to four inplace
00175      *  8-bit reversals followed by an end-for-end byteswap.
00176      *  In other words, the bytes of each bit are in the right order,
00177      *  but the bytes have been byteswapped.  So we now do an explicit
00178      *  byteswap.  On a little-endian machine, this byteswap and
00179      *  the final ntohl cancel out and could be elided.
00180      */
00181     byte0 = result & 0xff;
00182     byte1 = (result>>8) & 0xff;
00183     byte2 = (result>>16) & 0xff;
00184     byte3 = (result>>24) & 0xff;
00185 
00186     crc32 = ((byte0 << 24) |
00187              (byte1 << 16) |
00188              (byte2 << 8)  |
00189              byte3);
00190     // fprintf(stderr, "Computed crc32: %x\n", crc32);
00191     return crc32;
00192 }
00193 

© sourcejam.com 2005-2008