jstedfast/MailKit · error · ArgumentNullException

value

Error message

value

What it means

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).

Solutions

  1. Pass a non-null byte array (exactly 8 bytes) to ServerChallenge.
  2. Construct/parse the NtlmChallengeMessage from the actual server Type2 response instead of assigning raw fields.
  3. Null-check the parsed challenge bytes before assigning.

Example fix

// before
challenge.ServerChallenge = parsedChallenge; // parsedChallenge is null
// after
if (parsedChallenge != null && parsedChallenge.Length == 8)
	challenge.ServerChallenge = parsedChallenge;
Defensive patterns

Strategy: validation

Validate before calling

if (serverChallenge == null) throw new ArgumentException("ServerChallenge must not be null.");
if (serverChallenge.Length != 8) throw new ArgumentException("ServerChallenge must be exactly 8 bytes.");
challenge.ServerChallenge = serverChallenge;

Type guard

static bool IsValidChallenge(byte[]? value) => value != null && value.Length == 8;

Try / catch

try {
	challenge.ServerChallenge = value;
} catch (ArgumentNullException) {
	// fall back to parsing the raw Type2 response instead of manual assignment
	challenge = new NtlmChallengeMessage(rawResponse, 0);
}

Prevention

When it happens

Trigger: Assigning ServerChallenge = null directly, or setting it from a parsed field that was absent from the Type2 message.

Common situations: Challenge extracted from a malformed/short server response yielding null; test code resetting the property.

Related errors


AI-assisted analysis of jstedfast/MailKit@9d3859a785 (2026-09-15). Data as JSON: /api/errors/72da4591b21db4ea. Report an issue: GitHub.

Appendix: source

Thrown at MailKit/Security/Ntlm/NtlmChallengeMessage.cs:69

		{
			serverChallenge = new byte[8];
			Decode (message, startIndex, length);

			cached = new byte[length];
			Buffer.BlockCopy (message, startIndex, cached, 0, length);
		}

		~NtlmChallengeMessage ()
		{
			if (serverChallenge != null)
				Array.Clear (serverChallenge, 0, serverChallenge.Length);
		}

		public byte[] ServerChallenge {
			get { return serverChallenge; }
			set { 
				if (value == null)
					throw new ArgumentNullException (nameof (value));

				if (value.Length != 8)
					throw new ArgumentException ("Invalid nonce length (should be 8 bytes).", nameof (value));

				Array.Clear (serverChallenge, 0, serverChallenge.Length);
				serverChallenge = value;
			}
		}

		public string? TargetName {
			get; set;
		}

		public NtlmTargetInfo? TargetInfo {
			get; set;
		}

		public byte[]? GetEncodedTargetInfo ()

View on GitHub (pinned to 9d3859a785)