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
- Ensure the underlying digest is constructed before wrapping: new NonMemoableDigest(new Sha3Digest(256)).
- Add a null check or use ?? throw with a clear message where the digest is resolved from config/registry.
- 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
- Resolve the underlying digest with ?? throw before decoration.
- Validate algorithm-name-to-digest mappings at startup, not per call.
- Use nullable reference types (#nullable enable) to catch null IDigest flows at compile time.
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.