peass-ng/PEASS-ng · error · ArgumentNullException

baseDigest

Error message

baseDigest

What it means

The NonMemoableDigest constructor throws ArgumentNullException when the wrapped `baseDigest` is null. NonMemoableDigest is a decorator that prevents caching of digest results; it requires a real underlying IDigest to delegate to.

Source

Thrown at winPEAS/winPEASexe/winPEAS/3rdParty/BouncyCastle/crypto/digests/NonMemoableDigest.cs:22

{
    /**
     * Wrapper removes exposure to the IMemoable interface on an IDigest implementation.
     */
    public class NonMemoableDigest
        :   IDigest
    {
        protected readonly IDigest mBaseDigest;

        /**
         * Base constructor.
         *
         * @param baseDigest underlying digest to use.
         * @exception IllegalArgumentException if baseDigest is null
         */
        public NonMemoableDigest(IDigest baseDigest)
        {
            if (baseDigest == null)
                throw new ArgumentNullException("baseDigest");

            this.mBaseDigest = baseDigest;
        }

        public virtual string AlgorithmName
        {
            get { return mBaseDigest.AlgorithmName; }
        }

        public virtual int GetDigestSize()
        {
            return mBaseDigest.GetDigestSize();
        }

        public virtual void Update(byte input)
        {
            mBaseDigest.Update(input);
        }

View on GitHub (pinned to 53fb989abc)

Solutions

  1. Ensure the underlying digest is constructed before wrapping: new NonMemoableDigest(new Sha3Digest(256)).
  2. Add a null check or use ?? throw with a clear message where the digest is resolved from config/registry.
  3. Log which algorithm lookup returned null so the misconfiguration is visible.

Example fix

// before
IDigest base = registry.Resolve(algorithmName); // may be null
var digest = new NonMemoableDigest(base);
// after
IDigest base = registry.Resolve(algorithmName) ?? throw new InvalidOperationException($"Unknown digest: {algorithmName}");
var digest = new NonMemoableDigest(base);
Defensive patterns

Strategy: type-guard

Validate before calling

if (baseDigest is null)
    throw new InvalidOperationException("Underlying digest must be constructed before wrapping");
var wrapped = new NonMemoableDigest(baseDigest);

Type guard

bool CanWrap(IDigest d) => d is not null;
// C# 8+: IDigest d = maybeNull; if (d is IDigest nonNull) { new NonMemoableDigest(nonNull); }

Try / catch

try { var d = new NonMemoableDigest(baseDigest); } catch (ArgumentNullException ex) when (ex.ParamName == "baseDigest") { throw new InvalidOperationException("Digest resolution failed for configured algorithm", ex); }

Prevention

When it happens

Trigger: Calling `new NonMemoableDigest(null)` directly, or passing a variable/factory result that is null (e.g. a digest lookup that failed silently).

Common situations: Configuration-driven digest selection where an unsupported algorithm name maps to null; DI containers injecting an unresolved IDigest.

Related errors


AI-assisted analysis of peass-ng/PEASS-ng@53fb989abc (2026-09-02). Data as JSON: /api/errors/009e532b47a70fd0. Report an issue: GitHub.