init method

void init()

Implementation

void init() {
  if (null == _chainValue) {
    final List<Int64> newChainValue = [];

    // 0
    newChainValue.add(Const.blake2bIv[0] ^ (_digestSize | (_keyLength << 8) | 0x1010000));
    // 0x1010000 = ((fanout << 16) | (depth << 24) | (leafLength << 32));
    // with fanout = 1; depth = 0; leafLength = 0;

    // 1
    newChainValue.add(Const.blake2bIv[1]); // ^ nodeOffset; with nodeOffset = 0;

    // 2
    newChainValue.add(Const.blake2bIv[2]); // ^ ( nodeDepth | (innerHashLength << 8) );
    // with nodeDepth = 0; innerHashLength = 0;

    // 3
    newChainValue.add(Const.blake2bIv[3]);

    // 4, 5
    newChainValue.add(Const.blake2bIv[4]);
    newChainValue.add(Const.blake2bIv[5]);

    if (null != _salt) {
      newChainValue[4] ^= (ByteUtils.bytes2long(_salt!, 0));
      newChainValue[5] ^= (ByteUtils.bytes2long(_salt!, 8));
    }

    // 6, 7
    newChainValue.add(Const.blake2bIv[6]);
    newChainValue.add(Const.blake2bIv[7]);

    if (null != _personalization) {
      newChainValue[6] ^= (ByteUtils.bytes2long(_personalization!, 0));
      newChainValue[7] ^= (ByteUtils.bytes2long(_personalization!, 8));
    }

    _chainValue = newChainValue;
  }
}