https://stackoverflow.com/questions/20992760/understanding-bcryptsignhash-output-signature
matches your intuition: the format out of Microsoft's function is just the
two numbers concatenated together, perhaps they are little endian instead
of big endian though?

Alex

On Thu, Aug 11, 2016 at 1:38 PM, André Caron <andre.l.ca...@gmail.com>
wrote:

> Hi all,
>
> I'm dealing with a C++ client & server pair that uses ECDSA to verify the
> server's identity.  I'm trying to write a new Python client that will
> exchange with the server without making any changes to the server.  I've
> gotten quite a bit of this in place with cryptography (the Python package
> :-), but I'm incapable of getting the Python client to verify the signature
> sent by the server and I'd like to see if you can help me out.
>
> One of the problems here is that the serialization formats seem to be
> internal to Microsoft's CNG API.  For example, the public key is the raw
> output of BCryptExportKey() and the signature is the raw output of
> BCryptSignHash().  These are Microsoft APIs, so... needless to say
> cryptography doesn't "just work" with these formats.
>
> I'm pretty sure I managed to nail the key format conversion as Microsoft
> makes an obscure reference to the format[1], but I'm still having trouble
> with signatures.  The blob I get as output from BCryptSignHash() has 64
> bytes, but signatures for the same algorithm using cryptography are usually
> 70-72 bytes, so I'm confused.  Cryptography's ECC signature computation
> clearly documents the format: "The signature is formatted as DER-encoded
> bytes, as specified in RFC 3279."  However, Microsoft doesn't seem to
> output record an equivalent anywhere.  They're usually pretty consistent
> with their APIs and storage formats, so I assume some sort of storage
> similar to the keys where we have two 32-byte octet streams in big endian
> format containing the values for R and S, but I haven't had any luck with
> this.  I also know that the DER encoding for two integer fields will
> normally add 6 bytes of overhead, which gets us up to 70, but there is
> still the occasional extra 1 or 2 bytes, so I'm obviously missing something
> and may not be on the right track.
>
> [1] :https://msdn.microsoft.com/library/aa375520.aspx
>
> Anyways, I managed to extract the BCrypt* function calls from the server
> and client into a pair of C++ program the contain only the signing and
> signature verification code to reproduce the flow.  The total is ~30 lines
> of C++ code on each side, plus ~400 lines wrappers for BCrypt* calls
> (resource management, error handling and links to CNG API docs).
>
> I've also written a small cryptography-based Python program that tries to
> mimic the C++ client and I cannot get that part to run.
>
> If anyone has a few minutes to spare to give my Python code a second pair
> of eyeballs, I'd really appreciate it.
>
> I've saved up all of that on this Gist: https://gist.github.com/
> AndreLouisCaron/ab5ee411d0722a0981feceddbf5cb3d9
>
> The gist contents are as follows:
> - genkeys.py: generate a public/private key pair, write to disk in
> Microsoft's format;
> - server.cpp: load secret key, compute signature, save payload & signature
> to disk;
> - client.cpp: load public key, payload & signature from disk, verify
> signature;
> - common.h: stuff shared by client.cpp & server.cpp;
> - client.py: same as client.cpp, but using cryptography.
>
> I also have an alternate C++ client based on OpenSSL which might be a
> better source of inspiration.  I'll see if I can extract pars of that too
> as a reference since it might be easier to map to cryptography's internals.
>
> Thanks in advance,
>
> André
>
> _______________________________________________
> Cryptography-dev mailing list
> Cryptography-dev@python.org
> https://mail.python.org/mailman/listinfo/cryptography-dev
>
>


-- 
"I disapprove of what you say, but I will defend to the death your right to
say it." -- Evelyn Beatrice Hall (summarizing Voltaire)
"The people's good is the highest law." -- Cicero
GPG Key fingerprint: D1B3 ADC0 E023 8CA6
_______________________________________________
Cryptography-dev mailing list
Cryptography-dev@python.org
https://mail.python.org/mailman/listinfo/cryptography-dev

Reply via email to