code: public function encode(
          $username,
          $nt_domain,
          $client_hostname,
          CredentialInterface $credential,
          ServerChallenge $server_challenge
      ) {
          $negotiate_flags = $server_challenge->getNegotiateFlags();
          $server_challenge_nonce = $server_challenge->getNonce();
          $target_info = $server_challenge->getTargetInfo();
          $target_name = $this->identifyTargetName($username, $nt_domain, $server_challenge);
  
          // Generate a client challenge
          $client_challenge = $this->random_byte_generator->generate(static::CLIENT_CHALLENGE_LENGTH);
  
          // Encode the "blob"
          $binary_blob = $this->encodeBlob(new DateTime(), $client_challenge, $target_info);
  
          if ($credential->isPlaintext()) {
              $nt_hash = $this->nt_hasher->hash($credential, $username, $target_name);
          } elseif ($credential instanceof HashCredentialInterface && HashType::NT_V2 === $credential->getType()) {
              $nt_hash = $credential;
          } else {
              throw new InvalidArgumentException('Unsupported hash credential type');
          }
  
          $lm_challenge_response = $this->calculateLmResponse(
              $nt_hash,
              $client_challenge,
              $server_challenge_nonce
          );
  
          $nt_proof_string = $this->calculateNtProofString($nt_hash, $server_challenge_nonce, $binary_blob);
  
          $nt_challenge_response = ($nt_proof_string . $binary_blob);
  
          // TODO: Generate an encrypted random session key
          $session_key = '';
  
          return $this->encodeBinaryMessageString(
              $negotiate_flags,
              $lm_challenge_response,
              $nt_challenge_response,
              $target_name,
              $username,
              $client_hostname,
              $session_key
          );
      }
docs: {@inheritDoc}