I'm working on the DIGEST-MD5 SASL authentication and feel like I'm doing it perfectly, but my server is telling me I've got an incorrect auth for the right username and password. This is in Flash's ActionScript. Can you spot anything obvious I'm doing wrong?
<div><br class="webkit-block-placeholder"></div><div>I really appreciate it. Thanks!</div><div><br class="webkit-block-placeholder"></div><div>Jacob Wright<br><div><br class="webkit-block-placeholder"></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">base64decoder.decode(packet.toString());</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">bytes =&nbsp;base64decoder.flush();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> dataStr:String = bytes.readUTFBytes(bytes.bytesAvailable);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #009900">// transcode the string into an object</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> data:Object = stringToObject(dataStr);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #009900">// set up the return object which will be transcoded into a string later</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> obj:Object = {};</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj.username = username;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj.realm = data.realm;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj.nonce = data.nonce;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj.charset = <span style="color: #990000">&quot;utf-8&quot;</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj[<span style="color: #990000">&quot;digest-uri&quot;</span>] = <span style="color: #990000">&quot;xmpp/&quot;</span> + (conn.domain || conn.host);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #0033ff">if</span> (data.algorithm)</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span>obj.algorithm = data.algorithm;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><a href="http://obj.nc">obj.nc</a> = <span style="color: #990000">&quot;00000001&quot;</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #0033ff">if</span> (data.qop)</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span>obj.qop = <span style="color: #990000">&quot;auth&quot;</span>;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj.cnonce = conn.generateId();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> a1:String, a2:String;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">a1 = MD5.hash(obj.username + <span style="color: #990000">&quot;:&quot;</span> + obj.realm + <span style="color: #990000">&quot;:&quot;</span> + password) + 
<span style="color: #990000">&quot;:&quot;</span> + obj.nonce + <span style="color: #990000">&quot;:&quot;</span> + obj.cnonce;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #990000"><span style="color: #000000">a2 = </span>&quot;AUTHENTICATE:&quot;<span style="color: #000000"> + obj[</span>&quot;digest-uri&quot;<span style="color: #000000">
];</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> response:String;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #0033ff">if</span> (obj.qop)</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span>response = MD5.hash(MD5.hash(a1) + <span style="color: #990000">&quot;:&quot;</span> + obj.nonce
 + <span style="color: #990000">&quot;:&quot;</span> + <a href="http://obj.nc">obj.nc</a> + <span style="color: #990000">&quot;:&quot;</span> + obj.cnonce + <span style="color: #990000">&quot;:&quot;</span> + obj.qop + <span style="color: #990000">
&quot;:&quot;</span> + MD5.hash(a2));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #0033ff">else</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span class="Apple-tab-span" style="white-space:pre">        </span>response = MD5.hash(MD5.hash(a1) + <span style="color: #990000">&quot;:&quot;</span> + obj.nonce
 + <span style="color: #990000">&quot;:&quot;</span> + MD5.hash(a2));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">obj.response = response;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> resultStr:String = objectToString(obj);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">base64encoder.encode(resultStr);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">resultStr =&nbsp;base64encoder.flush();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"><span style="color: #6699cc">var</span> result:XML = &lt;response xmlns={saslNS}&gt;{resultStr}&lt;/response&gt;;</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"><br></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco">conn.send(result);</p>
</p>
</div></div>