11e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan/* 21e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * CRC64 31e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * 41e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * Author: Lasse Collin <lasse.collin@tukaani.org> 51e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * 61e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * This file has been put into the public domain. 71e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * You can do whatever you want with this file. 81e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan */ 91e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 101e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnanpackage org.tukaani.xz.check; 111e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 121e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnanpublic class CRC64 extends Check { 131e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan private static final long poly = 0xC96C5795D7870F42L; 141e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan private static final long[] crcTable = new long[256]; 151e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 161e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan private long crc = -1; 171e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 181e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan static { 191e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan for (int b = 0; b < crcTable.length; ++b) { 201e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan long r = b; 211e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan for (int i = 0; i < 8; ++i) { 221e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan if ((r & 1) == 1) 231e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan r = (r >>> 1) ^ poly; 241e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan else 251e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan r >>>= 1; 261e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan } 271e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 281e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan crcTable[b] = r; 291e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan } 301e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan } 311e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 321e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan public CRC64() { 331e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan size = 8; 341e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan name = "CRC64"; 351e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan } 361e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 371e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan public void update(byte[] buf, int off, int len) { 381e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan int end = off + len; 391e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 401e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan while (off < end) 411e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan crc = crcTable[(buf[off++] ^ (int)crc) & 0xFF] ^ (crc >>> 8); 421e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan } 431e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 441e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan public byte[] finish() { 451e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan long value = ~crc; 461e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan crc = -1; 471e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 481e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan byte[] buf = new byte[8]; 491e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan for (int i = 0; i < buf.length; ++i) 501e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan buf[i] = (byte)(value >> (i * 8)); 511e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan 521e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan return buf; 531e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan } 541e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan} 55