HiveBrain v1.2.0
Get Started
← Back to all entries
patterncppMinor

Linux/Mac hashing SHA-1

Submitted by: @import:stackexchange-codereview··
0
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

#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);
}

    }
}

#endif

Solution

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:

#ifdef  __APPLE__
#define COMMON_DIGEST_FOR_OPENSSL
#include 
#define SHA1 CC_SHA1
#else
#include 
#endif


Whichever 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>
#endif
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<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.