poseidonSponge<F extends PastaFieldElement<F>> static method

Squeezing<F> poseidonSponge<F extends PastaFieldElement<F>>(
  1. List<F> state,
  2. Absorbing<F>? input,
  3. PoseidonSpec<F> spec
)

Implementation

static Squeezing<F> poseidonSponge<F extends PastaFieldElement<F>>(
  List<F> state,
  Absorbing<F>? input,
  PoseidonSpec<F> spec,
) {
  final rate = spec.rate();
  if (input != null) {
    for (int i = 0; i < state.length && i < input._fields.length; i++) {
      final value = input._fields[i];
      if (value == null) {
        throw ArgumentException.invalidOperationArguments(
          "poseidonSponge",
          reason:
              "Invalid State: this operation is not permitted in the current mode",
        );
      }
      state[i] = state[i] + value;
    }
  }
  // Apply Poseidon permutation
  permute(state, spec);
  // Prepare output (take first RATE words from state)
  final output = List<F?>.filled(rate, null);
  for (int i = 0; i < rate && i < state.length; i++) {
    output[i] = state[i];
  }
  return Squeezing<F>(output);
}