mirror of
https://github.com/AndorsTrailRelease/ATCS.git
synced 2025-10-27 18:44:03 +01:00
is activated in the workspace settings. This required the addition of a new lib (in source form) for a SipHash implementation.
54 lines
1.3 KiB
Java
54 lines
1.3 KiB
Java
package com.zackehh.siphash;
|
|
|
|
/**
|
|
* A container class to store both k0 and k1. These
|
|
* values are created from a 16 byte key passed into
|
|
* the constructor. This isn't ideal as it's another
|
|
* alloc, but it'll do for now.
|
|
*/
|
|
class SipHashKey {
|
|
|
|
/**
|
|
* The value of k0.
|
|
*/
|
|
final long k0;
|
|
|
|
/**
|
|
* The value of k1.
|
|
*/
|
|
final long k1;
|
|
|
|
/**
|
|
* Accepts a 16 byte input key and converts the
|
|
* first and last 8 byte chunks to little-endian.
|
|
* These values become k0 and k1.
|
|
*
|
|
* @param key the 16 byte key input
|
|
*/
|
|
public SipHashKey(byte[] key) {
|
|
if (key.length != 16) {
|
|
throw new IllegalArgumentException("Key must be exactly 16 bytes!");
|
|
}
|
|
this.k0 = bytesToLong(key, 0);
|
|
this.k1 = bytesToLong(key, 8);
|
|
}
|
|
|
|
/**
|
|
* Converts a chunk of 8 bytes to a number in little-endian
|
|
* format. Accepts an offset to determine where the chunk
|
|
* begins in the byte array.
|
|
*
|
|
* @param b our byte array
|
|
* @param offset the index to start at
|
|
* @return a little-endian long representation
|
|
*/
|
|
private static long bytesToLong(byte[] b, int offset) {
|
|
long m = 0;
|
|
for (int i = 0; i < 8; i++) {
|
|
m |= ((((long) b[i + offset]) & 0xff) << (8 * i));
|
|
}
|
|
return m;
|
|
}
|
|
|
|
}
|