aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflysha <flysha@live.com>2016-10-21 07:44:00 +0800
committerflysha <flysha@live.com>2016-10-21 07:44:00 +0800
commit337c96fc067ae5908d4cf5c8a188aa37588044ac (patch)
tree7a374ff62e9c769ef7ba824a5cdde9e5270f3076
parent2b8bdeb0441c9fb83fc79bf10a761d1bf11cd287 (diff)
downloadvcpkg-337c96fc067ae5908d4cf5c8a188aa37588044ac.tar.gz
vcpkg-337c96fc067ae5908d4cf5c8a188aa37588044ac.zip
Switch to using CertUtil to generate hash.
-rw-r--r--toolsrc/src/commands_hash.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/toolsrc/src/commands_hash.cpp b/toolsrc/src/commands_hash.cpp
index 672e24a24..20e960d02 100644
--- a/toolsrc/src/commands_hash.cpp
+++ b/toolsrc/src/commands_hash.cpp
@@ -9,14 +9,24 @@ namespace fs = std::tr2::sys;
namespace vcpkg
{
- void file_hash_sha512(fs::path const & path, char const * hash)
+ void file_hash_sha512(fs::path const & path, std::wstring const & hashType)
{
- auto cmd_line = Strings::format("Powershell -Command (Get-FileHash %s -Algorithm %s).Hash.ToLower()",
- Strings::utf16_to_utf8(path.c_str()),
- hash);
- auto ec_data = System::cmd_execute_and_capture_output(Strings::utf8_to_utf16(cmd_line));
- Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", cmd_line);
- System::print(ec_data.output.c_str());
+ auto cmd_line = Strings::wformat(LR"(CertUtil.exe -hashfile "%s" %s)",
+ path.c_str(), hashType.c_str());
+ auto ec_data = System::cmd_execute_and_capture_output(cmd_line);
+ Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", Strings::utf16_to_utf8(cmd_line));
+
+ std::string const & output = ec_data.output;
+
+ auto start = output.find_first_of("\r\n");
+ Checks::check_exit(start != std::string::npos, "Unexpected output format from command: %s", Strings::utf16_to_utf8(cmd_line));
+
+ auto end = output.find_first_of("\r\n", start + 1);
+ Checks::check_exit(end != std::string::npos, "Unexpected output format from command: %s", Strings::utf16_to_utf8(cmd_line));
+
+ auto hash = output.substr(start, end - start);
+ hash.erase(std::remove_if(hash.begin(), hash.end(), isspace), hash.end());
+ System::println(hash.c_str());
}
void hash_command(const vcpkg_cmd_arguments& args)
@@ -28,11 +38,11 @@ namespace vcpkg
if (args.command_arguments.size() == 1)
{
- file_hash_sha512(args.command_arguments[0], "SHA512");
+ file_hash_sha512(args.command_arguments[0], L"SHA512");
}
if (args.command_arguments.size() == 2)
{
- file_hash_sha512(args.command_arguments[0], args.command_arguments[1].c_str());
+ file_hash_sha512(args.command_arguments[0], Strings::utf8_to_utf16(args.command_arguments[1]));
}
exit(EXIT_SUCCESS);