{"record":{"id":"009e532b47a70fd0","repo":"peass-ng/PEASS-ng","slug":"basedigest","errorCode":null,"errorMessage":"baseDigest","messagePattern":"baseDigest","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"winPEAS/winPEASexe/winPEAS/3rdParty/BouncyCastle/crypto/digests/NonMemoableDigest.cs","lineNumber":22,"sourceCode":"{\n    /**\n     * Wrapper removes exposure to the IMemoable interface on an IDigest implementation.\n     */\n    public class NonMemoableDigest\n        :   IDigest\n    {\n        protected readonly IDigest mBaseDigest;\n\n        /**\n         * Base constructor.\n         *\n         * @param baseDigest underlying digest to use.\n         * @exception IllegalArgumentException if baseDigest is null\n         */\n        public NonMemoableDigest(IDigest baseDigest)\n        {\n            if (baseDigest == null)\n                throw new ArgumentNullException(\"baseDigest\");\n\n            this.mBaseDigest = baseDigest;\n        }\n\n        public virtual string AlgorithmName\n        {\n            get { return mBaseDigest.AlgorithmName; }\n        }\n\n        public virtual int GetDigestSize()\n        {\n            return mBaseDigest.GetDigestSize();\n        }\n\n        public virtual void Update(byte input)\n        {\n            mBaseDigest.Update(input);\n        }","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/peass-ng/PEASS-ng/blob/53fb989abc2219826385683a6fee826bd6cd38d6/winPEAS/winPEASexe/winPEAS/3rdParty/BouncyCastle/crypto/digests/NonMemoableDigest.cs#L4-L40","documentation":"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.","triggerScenarios":"Calling `new NonMemoableDigest(null)` directly, or passing a variable/factory result that is null (e.g. a digest lookup that failed silently).","commonSituations":"Configuration-driven digest selection where an unsupported algorithm name maps to null; DI containers injecting an unresolved IDigest.","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."],"exampleFix":"// before\nIDigest base = registry.Resolve(algorithmName); // may be null\nvar digest = new NonMemoableDigest(base);\n// after\nIDigest base = registry.Resolve(algorithmName) ?? throw new InvalidOperationException($\"Unknown digest: {algorithmName}\");\nvar digest = new NonMemoableDigest(base);","handlingStrategy":"type-guard","validationCode":"if (baseDigest is null)\n    throw new InvalidOperationException(\"Underlying digest must be constructed before wrapping\");\nvar wrapped = new NonMemoableDigest(baseDigest);","typeGuard":"bool CanWrap(IDigest d) => d is not null;\n// C# 8+: IDigest d = maybeNull; if (d is IDigest nonNull) { new NonMemoableDigest(nonNull); }","tryCatchPattern":"try { var d = new NonMemoableDigest(baseDigest); } catch (ArgumentNullException ex) when (ex.ParamName == \"baseDigest\") { throw new InvalidOperationException(\"Digest resolution failed for configured algorithm\", ex); }","preventionTips":["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."],"tags":["csharp","bouncycastle","null-argument","decorator"],"backgroundTag":"null-argument","analyzedSha":"53fb989abc2219826385683a6fee826bd6cd38d6","analyzedAt":"2026-09-02T04:25:09.259Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T11:17:12.671Z"}