import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.*;
import java.nio.*;

public class UpdateAADTest {
	public static void main(final String[] args) throws Exception {
		System.out.println("running test against Java " + System.getProperty("java.version") + " (" + System.getProperty("java.vm.version") + ")");

		final SecretKey key = KeyGenerator.getInstance("ChaCha20").generateKey();

		final byte[] nonce = new byte[12]; // ChaCha20-Poly1305 requires 12 bytes nonce
		new Random().nextBytes(nonce);
		final IvParameterSpec ivSpec = new IvParameterSpec(nonce);

		final Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305");
		cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

		final byte[] AAD = new byte[42]; // arbitrary AAD
		// a very large buffer
		final ByteBuffer largeBuffer = ByteBuffer.allocate(2048);
		// a smaller slice of that large buffer
		final ByteBuffer smallerSliceFromLargerBuffer = largeBuffer.slice(1024, 1024);
		// place the AAD in the smaller sliced buffer
		smallerSliceFromLargerBuffer.put(AAD);
        // updateAAD against that sliced buffer
        cipher.updateAAD(smallerSliceFromLargerBuffer);

		System.out.println("ChaCha20 Cipher.updateAAD() test completed successfully");
	}
}