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:
Brad King 2011-11-16 10:12:18 -05:00
parent 293a7f4e2a
commit 2e9c26cf96
12 changed files with 84 additions and 0 deletions

View File

@ -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)

View File

@ -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);

View File

@ -0,0 +1 @@
string(MD5)

View File

@ -0,0 +1 @@
string(MD5 md5)

View File

@ -0,0 +1 @@
string(MD5 md5 input extra_arg)

View File

@ -0,0 +1,2 @@
string(MD5 md5 "sample input string\n")
message("${md5}")

View File

@ -0,0 +1,2 @@
string(SHA1 sha1 "sample input string\n")
message("${sha1}")

View File

@ -0,0 +1,2 @@
string(SHA224 sha224 "sample input string\n")
message("${sha224}")

View File

@ -0,0 +1,2 @@
string(SHA256 sha256 "sample input string\n")
message("${sha256}")

View File

@ -0,0 +1,2 @@
string(SHA384 sha384 "sample input string\n")
message("${sha384}")

View File

@ -0,0 +1,2 @@
string(SHA512 sha512 "sample input string\n")
message("${sha512}")

View File

@ -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")