/** * Build new KeyAddrAddress for a given key * * @param key * to calculate address from * @param typeMark * any small number between 0 and 15 inclusive to be stored with address (will also be protected) * @param useSha3_384 * use longer but more solid hash which is more resistent to wuantum attacks */ public KeyAddress(AbstractKey key, int typeMark, boolean useSha3_384) { this.typeMark = typeMark; if ((typeMark & 0xF0) != 0) throw new IllegalArgumentException("type mark must be in [0..15] range"); keyMask = mask(key); Digest digest = useSha3_384 ? new Sha3_384() : new Sha3_256(); _isLong = useSha3_384; packed = new byte[1 + 4 + digest.getLength()]; packed[0] = (byte) (((keyMask << 4) | typeMark) & 0xFF); keyDigest = key.updateDigestWithKeyComponents(digest).digest(); System.arraycopy(keyDigest, 0, packed, 1, keyDigest.length); Digest crc = new Crc32(); crc.update(packed, 0, 1 + digest.getLength()); System.arraycopy(crc.digest(), 0, packed, 1 + digest.getLength(), 4); }