Add string(MD5) and string(SHA*) commands to compute hashes
Provide a CMake-language binding to these cryptographic hashes. Add a string() command API for MD5, SHA1, SHA224, SHA256, SHA384, and SHA512.
This commit is contained in:
parent
293a7f4e2a
commit
2e9c26cf96
|
@ -10,6 +10,8 @@
|
||||||
See the License for more information.
|
See the License for more information.
|
||||||
============================================================================*/
|
============================================================================*/
|
||||||
#include "cmStringCommand.h"
|
#include "cmStringCommand.h"
|
||||||
|
#include "cmCryptoHash.h"
|
||||||
|
|
||||||
#include <cmsys/RegularExpression.hxx>
|
#include <cmsys/RegularExpression.hxx>
|
||||||
#include <cmsys/SystemTools.hxx>
|
#include <cmsys/SystemTools.hxx>
|
||||||
|
|
||||||
|
@ -36,6 +38,15 @@ bool cmStringCommand
|
||||||
{
|
{
|
||||||
return this->HandleReplaceCommand(args);
|
return this->HandleReplaceCommand(args);
|
||||||
}
|
}
|
||||||
|
else if ( subCommand == "MD5" ||
|
||||||
|
subCommand == "SHA1" ||
|
||||||
|
subCommand == "SHA224" ||
|
||||||
|
subCommand == "SHA256" ||
|
||||||
|
subCommand == "SHA384" ||
|
||||||
|
subCommand == "SHA512" )
|
||||||
|
{
|
||||||
|
return this->HandleHashCommand(args);
|
||||||
|
}
|
||||||
else if(subCommand == "TOLOWER")
|
else if(subCommand == "TOLOWER")
|
||||||
{
|
{
|
||||||
return this->HandleToUpperLowerCommand(args, false);
|
return this->HandleToUpperLowerCommand(args, false);
|
||||||
|
@ -82,6 +93,27 @@ bool cmStringCommand
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool cmStringCommand::HandleHashCommand(std::vector<std::string> const& args)
|
||||||
|
{
|
||||||
|
if(args.size() != 3)
|
||||||
|
{
|
||||||
|
cmOStringStream e;
|
||||||
|
e << args[0] << " requires an output variable and an input string";
|
||||||
|
this->SetError(e.str().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmsys::auto_ptr<cmCryptoHash> hash(cmCryptoHash::New(args[0].c_str()));
|
||||||
|
if(hash.get())
|
||||||
|
{
|
||||||
|
std::string out = hash->HashString(args[2].c_str());
|
||||||
|
this->Makefile->AddDefinition(args[1].c_str(), out.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmStringCommand::HandleToUpperLowerCommand(
|
bool cmStringCommand::HandleToUpperLowerCommand(
|
||||||
std::vector<std::string> const& args, bool toUpper)
|
std::vector<std::string> const& args, bool toUpper)
|
||||||
|
|
|
@ -76,6 +76,8 @@ public:
|
||||||
" string(REPLACE <match_string>\n"
|
" string(REPLACE <match_string>\n"
|
||||||
" <replace_string> <output variable>\n"
|
" <replace_string> <output variable>\n"
|
||||||
" <input> [<input>...])\n"
|
" <input> [<input>...])\n"
|
||||||
|
" string(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512>\n"
|
||||||
|
" <output variable> <input>)\n"
|
||||||
" string(COMPARE EQUAL <string1> <string2> <output variable>)\n"
|
" string(COMPARE EQUAL <string1> <string2> <output variable>)\n"
|
||||||
" string(COMPARE NOTEQUAL <string1> <string2> <output variable>)\n"
|
" string(COMPARE NOTEQUAL <string1> <string2> <output variable>)\n"
|
||||||
" string(COMPARE LESS <string1> <string2> <output variable>)\n"
|
" string(COMPARE LESS <string1> <string2> <output variable>)\n"
|
||||||
|
@ -103,6 +105,8 @@ public:
|
||||||
"backslash through argument parsing.\n"
|
"backslash through argument parsing.\n"
|
||||||
"REPLACE will replace all occurrences of match_string in the input with "
|
"REPLACE will replace all occurrences of match_string in the input with "
|
||||||
"replace_string and store the result in the output.\n"
|
"replace_string and store the result in the output.\n"
|
||||||
|
"MD5, SHA1, SHA224, SHA256, SHA384, and SHA512 "
|
||||||
|
"will compute a cryptographic hash of the input string.\n"
|
||||||
"COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
|
"COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
|
||||||
"store true or false in the output variable.\n"
|
"store true or false in the output variable.\n"
|
||||||
"ASCII will convert all numbers into corresponding ASCII characters.\n"
|
"ASCII will convert all numbers into corresponding ASCII characters.\n"
|
||||||
|
@ -150,6 +154,7 @@ protected:
|
||||||
bool RegexMatch(std::vector<std::string> const& args);
|
bool RegexMatch(std::vector<std::string> const& args);
|
||||||
bool RegexMatchAll(std::vector<std::string> const& args);
|
bool RegexMatchAll(std::vector<std::string> const& args);
|
||||||
bool RegexReplace(std::vector<std::string> const& args);
|
bool RegexReplace(std::vector<std::string> const& args);
|
||||||
|
bool HandleHashCommand(std::vector<std::string> const& args);
|
||||||
bool HandleToUpperLowerCommand(std::vector<std::string> const& args,
|
bool HandleToUpperLowerCommand(std::vector<std::string> const& args,
|
||||||
bool toUpper);
|
bool toUpper);
|
||||||
bool HandleCompareCommand(std::vector<std::string> const& args);
|
bool HandleCompareCommand(std::vector<std::string> const& args);
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
string(MD5)
|
|
@ -0,0 +1 @@
|
||||||
|
string(MD5 md5)
|
|
@ -0,0 +1 @@
|
||||||
|
string(MD5 md5 input extra_arg)
|
|
@ -0,0 +1,2 @@
|
||||||
|
string(MD5 md5 "sample input string\n")
|
||||||
|
message("${md5}")
|
|
@ -0,0 +1,2 @@
|
||||||
|
string(SHA1 sha1 "sample input string\n")
|
||||||
|
message("${sha1}")
|
|
@ -0,0 +1,2 @@
|
||||||
|
string(SHA224 sha224 "sample input string\n")
|
||||||
|
message("${sha224}")
|
|
@ -0,0 +1,2 @@
|
||||||
|
string(SHA256 sha256 "sample input string\n")
|
||||||
|
message("${sha256}")
|
|
@ -0,0 +1,2 @@
|
||||||
|
string(SHA384 sha384 "sample input string\n")
|
||||||
|
message("${sha384}")
|
|
@ -0,0 +1,2 @@
|
||||||
|
string(SHA512 sha512 "sample input string\n")
|
||||||
|
message("${sha512}")
|
|
@ -1,3 +1,35 @@
|
||||||
|
set(MD5-BadArg1-RESULT 1)
|
||||||
|
set(MD5-BadArg1-STDERR "string MD5 requires an output variable")
|
||||||
|
set(MD5-BadArg2-RESULT 1)
|
||||||
|
set(MD5-BadArg2-STDERR "string MD5 requires an output variable and an input string")
|
||||||
|
set(MD5-BadArg4-RESULT 1)
|
||||||
|
set(MD5-BadArg4-STDERR "string MD5 requires an output variable and an input string")
|
||||||
|
set(MD5-Works-RESULT 0)
|
||||||
|
set(MD5-Works-STDERR "10d20ddb981a6202b84aa1ce1cb7fce3")
|
||||||
|
set(SHA1-Works-RESULT 0)
|
||||||
|
set(SHA1-Works-STDERR "83f093e04289b21a9415f408ad50be8b57ad2f34")
|
||||||
|
set(SHA224-Works-RESULT 0)
|
||||||
|
set(SHA224-Works-STDERR "e995a7789922c4ef9279d94e763c8375934180a51baa7147bc48edf7")
|
||||||
|
set(SHA256-Works-RESULT 0)
|
||||||
|
set(SHA256-Works-STDERR "d1c5915d8b71150726a1eef75a29ec6bea8fd1bef6b7299ef8048760b0402025")
|
||||||
|
set(SHA384-Works-RESULT 0)
|
||||||
|
set(SHA384-Works-STDERR "1de9560b4e030e02051ea408200ffc55d70c97ac64ebf822461a5c786f495c36df43259b14483bc8d364f0106f4971ee")
|
||||||
|
set(SHA512-Works-RESULT 0)
|
||||||
|
set(SHA512-Works-STDERR "3982a1b4e651768bec70ab1fb97045cb7a659f4ba7203d501c52ab2e803071f9d5fd272022df15f27727fc67f8cd022e710e29010b2a9c0b467c111e2f6abf51")
|
||||||
|
|
||||||
|
include("@CMAKE_CURRENT_SOURCE_DIR@/CheckCMakeTest.cmake")
|
||||||
|
check_cmake_test(String
|
||||||
|
MD5-BadArg1
|
||||||
|
MD5-BadArg2
|
||||||
|
MD5-BadArg4
|
||||||
|
MD5-Works
|
||||||
|
SHA1-Works
|
||||||
|
SHA224-Works
|
||||||
|
SHA256-Works
|
||||||
|
SHA384-Works
|
||||||
|
SHA512-Works
|
||||||
|
)
|
||||||
|
|
||||||
# Execute each test listed in StringTestScript.cmake:
|
# Execute each test listed in StringTestScript.cmake:
|
||||||
#
|
#
|
||||||
set(scriptname "@CMAKE_CURRENT_SOURCE_DIR@/StringTestScript.cmake")
|
set(scriptname "@CMAKE_CURRENT_SOURCE_DIR@/StringTestScript.cmake")
|
||||||
|
|
Loading…
Reference in New Issue