{"record":{"id":"72da4591b21db4ea","repo":"jstedfast/MailKit","slug":"value-ntlmchallengemessage","errorCode":null,"errorMessage":"value","messagePattern":"value","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"MailKit/Security/Ntlm/NtlmChallengeMessage.cs","lineNumber":69,"sourceCode":"\t\t{\n\t\t\tserverChallenge = new byte[8];\n\t\t\tDecode (message, startIndex, length);\n\n\t\t\tcached = new byte[length];\n\t\t\tBuffer.BlockCopy (message, startIndex, cached, 0, length);\n\t\t}\n\n\t\t~NtlmChallengeMessage ()\n\t\t{\n\t\t\tif (serverChallenge != null)\n\t\t\t\tArray.Clear (serverChallenge, 0, serverChallenge.Length);\n\t\t}\n\n\t\tpublic byte[] ServerChallenge {\n\t\t\tget { return serverChallenge; }\n\t\t\tset { \n\t\t\t\tif (value == null)\n\t\t\t\t\tthrow new ArgumentNullException (nameof (value));\n\n\t\t\t\tif (value.Length != 8)\n\t\t\t\t\tthrow new ArgumentException (\"Invalid nonce length (should be 8 bytes).\", nameof (value));\n\n\t\t\t\tArray.Clear (serverChallenge, 0, serverChallenge.Length);\n\t\t\t\tserverChallenge = value;\n\t\t\t}\n\t\t}\n\n\t\tpublic string? TargetName {\n\t\t\tget; set;\n\t\t}\n\n\t\tpublic NtlmTargetInfo? TargetInfo {\n\t\t\tget; set;\n\t\t}\n\n\t\tpublic byte[]? GetEncodedTargetInfo ()","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/jstedfast/MailKit/blob/9d3859a7855e3e17582c07fd01972b8e262bf176/MailKit/Security/Ntlm/NtlmChallengeMessage.cs#L51-L87","documentation":"Guard in the NtlmChallengeMessage.ServerChallenge property setter: the challenge (nonce) value was null. The NTLM challenge message requires an 8-byte server challenge, so null is rejected with ArgumentNullException (a wrong-length value raises ArgumentException instead).","triggerScenarios":"Assigning ServerChallenge = null directly, or setting it from a parsed field that was absent from the Type2 message.","commonSituations":"Challenge extracted from a malformed/short server response yielding null; test code resetting the property.","solutions":["Pass a non-null byte array (exactly 8 bytes) to ServerChallenge.","Construct/parse the NtlmChallengeMessage from the actual server Type2 response instead of assigning raw fields.","Null-check the parsed challenge bytes before assigning."],"exampleFix":"// before\nchallenge.ServerChallenge = parsedChallenge; // parsedChallenge is null\n// after\nif (parsedChallenge != null && parsedChallenge.Length == 8)\n\tchallenge.ServerChallenge = parsedChallenge;","handlingStrategy":"validation","validationCode":"if (serverChallenge == null) throw new ArgumentException(\"ServerChallenge must not be null.\");\nif (serverChallenge.Length != 8) throw new ArgumentException(\"ServerChallenge must be exactly 8 bytes.\");\nchallenge.ServerChallenge = serverChallenge;","typeGuard":"static bool IsValidChallenge(byte[]? value) => value != null && value.Length == 8;","tryCatchPattern":"try {\n\tchallenge.ServerChallenge = value;\n} catch (ArgumentNullException) {\n\t// fall back to parsing the raw Type2 response instead of manual assignment\n\tchallenge = new NtlmChallengeMessage(rawResponse, 0);\n}","preventionTips":["Prefer constructing NtlmChallengeMessage from the raw server response over manual property assignment.","Null-check parsed fields before assigning them.","Don't overwrite ServerChallenge in normal flows; it is set during parsing."],"tags":["null-argument","csharp","ntlm","nonce"],"backgroundTag":"null-argument","analyzedSha":"9d3859a7855e3e17582c07fd01972b8e262bf176","analyzedAt":"2026-09-15T15:46:11.592Z","contentChangedAt":"2026-09-15T15:46:11.592Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}