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