code: public byte[] encrypt(byte[] ctrKey, byte[] macKey, byte[] plaintext, byte[]... associatedData) {
  		// Check if plaintext length will cause overflows
  		if (plaintext.length > (Integer.MAX_VALUE - 16)) {
  			throw new IllegalArgumentException("Plaintext is too long");
  		}
  
  		assert plaintext.length + 15 < Integer.MAX_VALUE;
  		final int numBlocks = (plaintext.length + 15) / 16;
  		final byte[] iv = s2v(macKey, plaintext, associatedData);
  		final byte[] keystream = generateKeyStream(ctrKey, iv, numBlocks);
  		final byte[] ciphertext = xor(plaintext, keystream);
  
  		// concat IV + ciphertext:
  		final byte[] result = new byte[iv.length + ciphertext.length];
  		System.arraycopy(iv, 0, result, 0, iv.length);
  		System.arraycopy(ciphertext, 0, result, iv.length, ciphertext.length);
  		return result;
  	}
docs: Encrypts plaintext using SIV mode. A block cipher defined by the constructor is being used.<br>
  
  @param ctrKey SIV mode requires two separate keys. You can use one long key, which is splitted in half. See https://tools.ietf.org/html/rfc5297#section-2.2
  @param macKey SIV mode requires two separate keys. You can use one long key, which is splitted in half. See https://tools.ietf.org/html/rfc5297#section-2.2
  @param plaintext Your plaintext, which shall be encrypted.
  @param associatedData Optional associated data, which gets authenticated but not encrypted.
  @return IV + Ciphertext as a concatenated byte array.
  @throws IllegalArgumentException if the either of the two keys is of invalid length for the used {@link BlockCipher}.