// See file LICENSE for more information.

part of '../../api.dart';

/// The interface stream ciphers conform to.
abstract class StreamCipher extends Algorithm {
  /// Create the cipher specified by the standard [algorithmName].
  factory StreamCipher(String algorithmName) =>
      registry.create<StreamCipher>(algorithmName);

  /// Reset the cipher to its original state.
  void reset();

  /// Init the cipher with its initialization [params]. The type of
  /// [CipherParameters] depends on the algorithm being used (see the
  /// documentation of each implementation to find out more).
  ///
  /// Use the argument [forEncryption] to tell the cipher if you want to encrypt
  /// or decrypt data.
  void init(bool forEncryption, CipherParameters? params);

  /// Process a whole block of [data] at once, returning the result in a byte array.
  Uint8List process(Uint8List data);

  /// Process one byte of data given by [inp] and return its encrypted value.
  int returnByte(int inp);

  /// Process [len] bytes of data given by [inp] and starting at offset [inpOff].
  /// The resulting cipher text is put in [out] beginning at position [outOff].
  void processBytes(
      Uint8List inp, int inpOff, int len, Uint8List out, int outOff);
}
