<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7653.38">
<TITLE>Adding NTLMv2 support for Cyrus SASL 2.1.23</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->
<BR>

<P><FONT SIZE=2>Ken,<BR>
<BR>
Sorry for replying late.<BR>
<BR>
I have hard coded the 'blob' structure as follows in ntlm_client_mech_step2()<BR>
inside plugins/ntlm.c:<BR>
<BR>
<BR>
&nbsp;/* should we send a NTLMv2 response? */<BR>
&nbsp;&nbsp;&nbsp; params-&gt;utils-&gt;getopt(params-&gt;utils-&gt;getopt_context,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &quot;NTLM&quot;, &quot;ntlm_v2&quot;, &amp;sendv2, NULL);<BR>
<BR>
&nbsp;/****************commented by dhruva - NTLMv2 support*/<BR>
&nbsp;&nbsp; /*if (sendv2 &amp;&amp; (*sendv2 == '1' || *sendv2 == 'y' ||<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*sendv2 == 'o' &amp;&amp; *sendv2 == 'n') || *sendv2 == 't'))*/<BR>
&nbsp;&nbsp; {<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bloblen;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *blobbuf=NULL;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char signature[4];<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char reserved[4];<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char unknown[4];<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char timestamp[8];<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* put the cnonce in place after the LMv2 HMAC */<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *cnonce = resp + MD5_DIGEST_LENGTH;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signature[0]=0x01;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signature[1]=0x01;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signature[2]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signature[3]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reserved[0]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reserved[1]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reserved[2]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reserved[3]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unknown[0]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unknown[1]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unknown[2]=0x00;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unknown[3]=0x00;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params-&gt;utils-&gt;log(NULL, SASL_LOG_DEBUG,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;calculating LMv2 response&quot;);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params-&gt;utils-&gt;rand(params-&gt;utils-&gt;rpool, cnonce, NTLM_NONCE_LENGTH);<BR>
<BR>
&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unix_timestamp(timestamp);&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bloblen=32+190;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blobbuf=malloc(bloblen);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf,signature,4);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+4,reserved,4);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+8,timestamp,8);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+16,cnonce,8);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+24,unknown,4);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+28,serverin+64,190);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+28+190,unknown,4);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(blobbuf+28+190+4,unknown,4);<BR>
&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* this is for LMv2 response*/<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*V2(resp, password, oparams-&gt;authid, domain,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serverin + NTLM_TYPE2_CHALLENGE_OFFSET, cnonce, NTLM_NONCE_LENGTH,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params-&gt;utils, &amp;text-&gt;out_buf, &amp;text-&gt;out_buf_len, &amp;result);*/<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*for NTLMv2 response*/<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V2(resp,password,oparams-&gt;authid,domain,serverin+NTLM_TYPE2_CHALLENGE_OFFSET,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; blobbuf,bloblen,params-&gt;utils,&amp;text-&gt;out_buf,&amp;text-&gt;out_buf_len,&amp;result);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //lm_resp = resp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(resp+16,blobbuf,bloblen); /*first 16 bytes has hmac-md5(blobbuf) in 'resp'*/<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nt_resp=resp;<BR>
&nbsp;&nbsp;&nbsp; }<BR>
<BR>
The 'resp' buffer size in my case is 32+190+16 where 32 is the size of the<BR>
blob without TIB size, 190 is the TIB size and 16 is the size<BR>
of hmac-md5(blobbuf).<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
One of the parameter being passed in the line<BR>
&nbsp; &quot;<BR>
&nbsp;&nbsp; /* should we send a NTLMv2 response? */<BR>
&nbsp;&nbsp;&nbsp; params-&gt;utils-&gt;getopt(params-&gt;utils-&gt;getopt_context,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &quot;NTLM&quot;, &quot;ntlm_v2&quot;, &amp;sendv2, NULL);<BR>
&nbsp; &quot;<BR>
is &quot;ntlm_v2&quot;. When I checked, the &quot;sendv2&quot; value is not '1' or 'y'.<BR>
So the condition check &quot;if (&amp;sendv2 == ...)&quot; fails. That is the reason I have<BR>
commented this check as above.<BR>
Can you please guide me about how to pass this check?<BR>
<BR>
<BR>
Sorry, I don't know how to create a patch file.<BR>
<BR>
<BR>
Thanks,<BR>
Dhruva</FONT>
</P>

<pre>
</pre></BODY>
</HTML>