On 12/16/2016 5:46 AM, Mariusz Gogulski wrote:
We are using cURL to handle SMTP sessions in our mail client. We are using SSPI version of encryption (Schannel). Some of our users are rarely experiencing problems during handshake. It happens every few days once or twice a day (so it looks very random) but it occured only for 3 smtp servers so far (out of 200 smtp servers that are currently being used by our users). Below is log from such session with schannel information. As you can see at some point InitializeSecurityContext fails with error SEC_E_MESSAGE_ALTERED. It looks like offset in last packet is not proper in step 2/3 comparing it with correct handshake:
Correct handshake:
schannel: encrypted data buffer: *offset 242* length 4218.
schannel: SSL/TLS handshake complete.
Incorrect handshake:
schannel: encrypted data buffer: *offset 7* length 4218.
schannel: next InitializeSecurityContext failed: SEC_E_MESSAGE_ALTERED
What could be the reason of this problem? Is it rather server side or client side kind of problem? Is there anything we can do to fix it on client side?

There were some bugs in how curl uses schannel that were fixed in 7.43.0 but it seems you are using at least that version, based on your output. What is the version of curl / libcurl are you using? curl -V / curl_version().

schannel performance and capability varies between different versions of Windows. For example Windows XP Schannel doesn't support some now-common encryption algorithms so it can't connect to some servers that only accept those algorithms. If you are running on multiple versions of Windows is there any version it does not happen on?

That it's random though has me concerned. Schannel doc is plenty vague on this error code but from what I could gather it has to do with message integrity. Also I found in a google search an MS employee said this [1] about it:

"The usual reason that SEC_E_MESSAGE_ALTERED is returned is when the passed in packet fails its MAC check after being decrypted. This happens when the packet has been modified since it was encrypted. This can also happen when the application is attempting to decrypt a packet using the wrong context handle, or if packets are decrypted out of order."

So this could be a bug in curl or it could be your server is severing the connection or corruption. If you have the ability to Wireshark the connection and capture the packets maybe that can give you some idea by comparing to the logs. And in the 'correct handshake' do you see 'schannel: a client certificate has been requested.' ?


[1]: http://microsoft.public.platformsdk.security.narkive.com/4JAvlMvD/help-please-schannel-security-contexts-and-decryptmessage

-------------------------------------------------------------------
List admin: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:  https://curl.haxx.se/mail/etiquette.html

Reply via email to