class AesGcmStreamEncryptionService implements StreamEncryptionService {

  @VisibleForTesting
  byte[] encryptWithIv(final SharedSecret sharedSecret, final byte[] plainText, final byte[] iv)
      throws EncryptionException {
    Objects.requireNonNull(sharedSecret);
    Objects.requireNonNull(plainText);
    Objects.requireNonNull(iv);

    if (this.encryptionMode == EncryptionMode.ENCRYPT_NON_STANDARD) {
      return this.nonStandardModeEncryptWithIv(sharedSecret, plainText, iv);
    } else {
      return this.standardModeEncryptWithIv(sharedSecret, plainText, iv);
    }
  }

  public  AesGcmStreamEncryptionService();
  public  AesGcmStreamEncryptionService(final EncryptionMode encryptionMode);

}