patterncppMinor
Linux/Mac hashing SHA-1
Viewed 0 times
hashingmacshalinux
Problem
To do password exchange on the SQL server I need to use SHA-1 to generate a hash (no plain password exchange).
This is done differently on Linux/Mac so I abstracted it slightly.
ThorCryptWrapper.h
This is done differently on Linux/Mac so I abstracted it slightly.
ThorCryptWrapper.h
#ifndef THORS_ANVIL_MYSQL_DETAILS_THOR_CRYPTO_WRAPPER_H
#define THORS_ANVIL_MYSQL_DETAILS_THOR_CRYPTO_WRAPPER_H
#ifdef __APPLE__
#define COMMON_DIGEST_FOR_OPENSSL
#include
#define THOR_SHA1(data, len, dst) CC_SHA1(data, len, dst)
#else
#include
#define THOR_SHA1(data, len, dst) SHA1(data, len, dst)
#endif
namespace ThorsAnvil
{
namespace MySQL
{
typedef unsigned char ThorSHADigestStore[SHA_DIGEST_LENGTH];
inline void thorSHA1(ThorSHADigestStore& dest, ThorSHADigestStore& src)
{
THOR_SHA1(src, SHA_DIGEST_LENGTH, dest);
}
inline void thorSHA1(ThorSHADigestStore& dest, std::string const& src)
{
THOR_SHA1(reinterpret_cast(&src[0]), src.length(), dest);
}
}
}
#endifSolution
There's not a huge amount to review here.
It looks like the Apple code is intended to be a drop-in replacement for OpenSSL, so you could probably just rename to match, rather than creating a new name:
Whichever approach you take, don't forget to
I would prefer
And I think I prefer
Is there any reason that
I withhold comment on the suitability of SHA-1 for this purpose, as that appears to be something you're stuck with.
It looks like the Apple code is intended to be a drop-in replacement for OpenSSL, so you could probably just rename to match, rather than creating a new name:
#ifdef __APPLE__
#define COMMON_DIGEST_FOR_OPENSSL
#include
#define SHA1 CC_SHA1
#else
#include
#endifWhichever approach you take, don't forget to
#undef the macro when you've finished using it (definitely before the end of the header), to avoid polluting the macro namespace for others.I would prefer
src.data() to &src[0] as the idiomatic way to access a string's characters as an array of char.And I think I prefer
sizeof src to SHA_DIGEST_LENGTH in the first overload, so that the connection is clear.Is there any reason that
src can't be a reference to const in both versions?inline void thorSHA1(ThorSHADigestStore& dest, ThorSHADigestStore const& src)
{
THOR_SHA1(src, sizeof src, dest);
}
inline void thorSHA1(ThorSHADigestStore& dest, std::string const& src)
{
auto const src_bytes = reinterpret_cast(src.data());
THOR_SHA1(src_bytes, src.length(), dest);
}I withhold comment on the suitability of SHA-1 for this purpose, as that appears to be something you're stuck with.
Code Snippets
#ifdef __APPLE__
#define COMMON_DIGEST_FOR_OPENSSL
#include <CommonCrypto/CommonDigest.h>
#define SHA1 CC_SHA1
#else
#include <openssl/sha.h>
#endifinline void thorSHA1(ThorSHADigestStore& dest, ThorSHADigestStore const& src)
{
THOR_SHA1(src, sizeof src, dest);
}
inline void thorSHA1(ThorSHADigestStore& dest, std::string const& src)
{
auto const src_bytes = reinterpret_cast<const unsigned char*>(src.data());
THOR_SHA1(src_bytes, src.length(), dest);
}Context
StackExchange Code Review Q#158305, answer score: 2
Revisions (0)
No revisions yet.