malxau / yori

Yori is a CMD replacement shell that supports backquotes, job control, and improves tab completion, file matching, aliases, command history, and more.
http://www.malsmith.net/yori/
MIT License
1.24k stars 31 forks source link

yhash not supported in Windows XP #98

Closed zoomosis closed 2 years ago

zoomosis commented 3 years ago

Using yhash.exe in Windows XP SP3 results in the error message "hash: operating system support not present".

Obviously XP is now "vintage" and unsupported, though if you're building Yori with MSVC 2.0 I suspect you'd like to have Yori's compatibility to go all the way back to Windows NT 3.1. So perhaps yhash should supply its own hashing code rather than relying on a modern Windows API call.

Also, "yhash -?" should document that SHA1 is the default algorithm if none is specified.

Thanks!

malxau commented 3 years ago

At its core, Yori is still just a shell around functionality provided by a platform. Trying to move into the territory of implementing platform functionality would be a substantial extension, and it's not something that one person can really do by themselves.

Frankly, I'd be a terrible person to implement a crypto library. The real task here is taking an existing crypto library, and backporting it to run on an older compiler, operating system, and CPU. After that it still needs to be maintained, since crypto is an eternally evolving space.

Note that the core of the BCrypt.dll engine, which Yori is using, is now open sourced at https://github.com/microsoft/SymCrypt . It unfortunately doesn't directly expose the same interfaces as BCrypt.dll, but from Yori's point of view, the ideal thing would be to take that code, add BCrypt.dll exports, do all of the backporting, and end up with a drop-in BCrypt.dll for older systems. That not only enables Yori to work, but also enables other software that wants newer Windows crypto to work. That also means it's completely decoupled from any of the code here.

Agree that I should update the help text to indicate SHA1 is used by default.

tumagonx commented 3 years ago

why not using Wincrypt? I think XP SP3 with CSP update capable of SHA-512 (not bad)

zoomosis commented 3 years ago

With a couple of syntax changes to accommodate Open Watcom 2.0, I was able to build and run Microsoft's own example code for calculating MD5 checksums:

https://docs.microsoft.com/en-us/windows/win32/seccrypto/example-c-program--creating-an-md-5-hash-from-file-content

The binary seems to run fine under XP SP3 and NT 4.0 SP6.

NT 3.51 is too old and complains that the CryptAcquireContextA procedure is missing from ADVAPI32.DLL.

If you're using MSVC 2.0 then I suspect wincrypt.h is missing from the headers but maybe that's not too difficult to work around and conceivably a lot easier than wrestling with BCrypt.

(Obviously MD5 isn't perfect, but it's still useful.)

malxau commented 3 years ago

Thanks, I didn't know these functions existed. Agree that if there's an option that exists on more versions, Yori should use it.

It doesn't matter much about working around missing header defines or exports. That already needed to exist for the Vista+ version anyway, so it's just about changing from one set of functions to another.

I have changes pending for this which I'll push soon. As you've already noted, MD5 and SHA1 exists on NT4+. SHA256/384/512 exists on XP SP3 and 2003 SP2. There's some hacking around requesting the "enhanced" provider which provides those hashes, but it's not too serious.