public void SignMessage(SipMessageWriter writer)
            {
                outSnum++;
                int srand2 = Environment.TickCount;

                InitializeThreadStaticVars();

                int length = SignatureBuffer.Generate(scheme, srand2, outSnum, targetname, writer, ref bytes1);

                if (bytes2.Length < maxSignatureSize)
                {
                    bytes2 = new byte[maxSignatureSize];
                }

                secBufferDesc1.Buffers[0].SetBuffer(BufferType.SECBUFFER_DATA, bytes1, 0, length);
                secBufferDesc1.Buffers[1].SetBuffer(BufferType.SECBUFFER_TOKEN, bytes2);

                var result = Sspi.SafeMakeSignature(contextHandle, ref secBufferDesc1, 100);

                Tracer.WriteInformation("Signature: " + result.ToString());

                if (Sspi.Succeeded(result))
                {
                    writer.WriteAuthenticationInfo(true, scheme, targetname, realm, Opaque, outSnum, srand2,
                                                   new ArraySegment <byte>(bytes2, 0, secBufferDesc1.Buffers[1].Size));

                    if (writer.IsResponse && writer.StatusCode >= 200 && writer.StatusCode <= 299)
                    {
                        if (writer.Method == Methods.Registerm && writer.Expires != int.MinValue)
                        {
                            idleTime = DateTime.UtcNow.AddSeconds(writer.Expires + 30);
                            idleTimeUpdatedByExpires = true;
                        }
                    }
                    else
                    {
                        // TODO: INVITE Session-Expires
                    }
                }
            }