Skip to content

Commit

Permalink
[5392] added additional hash algorithms
Browse files Browse the repository at this point in the history
see [irods/irods_client_globus_connector#9]

sha512
sha1
adler32
  • Loading branch information
JustinKyleJames committed Feb 22, 2021
1 parent 40ad875 commit fa05c3a
Show file tree
Hide file tree
Showing 10 changed files with 274 additions and 1 deletion.
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -985,6 +985,9 @@ set(
${CMAKE_SOURCE_DIR}/lib/hasher/src/Hasher.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/MD5Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/SHA256Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/SHA512Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/ADLER32Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/SHA1Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/checksum.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/irods_hasher_factory.cpp
${CMAKE_SOURCE_DIR}/lib/rbudp/src/QUANTAnet_rbudpBase_c.cpp
Expand Down Expand Up @@ -1151,6 +1154,9 @@ set(
${CMAKE_SOURCE_DIR}/lib/hasher/src/Hasher.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/MD5Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/SHA256Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/SHA512Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/ADLER32Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/SHA1Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/checksum.cpp
${CMAKE_SOURCE_DIR}/lib/hasher/src/irods_hasher_factory.cpp
)
Expand Down
26 changes: 26 additions & 0 deletions lib/hasher/include/ADLER32Strategy.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef _ADLER32_STRATEGY_HPP_
#define _ADLER32_STRATEGY_HPP_

#include "HashStrategy.hpp"
#include <string>
#include <openssl/sha.h>

namespace irods {
const std::string ADLER32_NAME( "adler32" );
class ADLER32Strategy : public HashStrategy {
public:
ADLER32Strategy() {};
virtual ~ADLER32Strategy() {};

virtual std::string name() const {
return ADLER32_NAME;
}
virtual error init( boost::any& context ) const;
virtual error update( const std::string& data, boost::any& context ) const;
virtual error digest( std::string& messageDigest, boost::any& context ) const;
virtual bool isChecksum( const std::string& ) const;

};
}; // namespace irods

#endif // _ADLER32_STRATEGY_HPP_
26 changes: 26 additions & 0 deletions lib/hasher/include/SHA1Strategy.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef _SHA1_STRATEGY_HPP_
#define _SHA1_STRATEGY_HPP_

#include "HashStrategy.hpp"
#include <string>
#include <openssl/sha.h>

namespace irods {
const std::string SHA1_NAME( "sha1" );
class SHA1Strategy : public HashStrategy {
public:
SHA1Strategy() {};
virtual ~SHA1Strategy() {};

virtual std::string name() const {
return SHA1_NAME;
}
virtual error init( boost::any& context ) const;
virtual error update( const std::string& data, boost::any& context ) const;
virtual error digest( std::string& messageDigest, boost::any& context ) const;
virtual bool isChecksum( const std::string& ) const;

};
}; // namespace irods

#endif // _SHA1_STRATEGY_HPP_
26 changes: 26 additions & 0 deletions lib/hasher/include/SHA512Strategy.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef _SHA512_STRATEGY_HPP_
#define _SHA512_STRATEGY_HPP_

#include "HashStrategy.hpp"
#include <string>
#include <openssl/sha.h>

namespace irods {
const std::string SHA512_NAME( "sha512" );
class SHA512Strategy : public HashStrategy {
public:
SHA512Strategy() {};
virtual ~SHA512Strategy() {};

virtual std::string name() const {
return SHA512_NAME;
}
virtual error init( boost::any& context ) const;
virtual error update( const std::string& data, boost::any& context ) const;
virtual error digest( std::string& messageDigest, boost::any& context ) const;
virtual bool isChecksum( const std::string& ) const;

};
}; // namespace irods

#endif // _SHA512_STRATEGY_HPP_
3 changes: 3 additions & 0 deletions lib/hasher/include/checksum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ extern "C" {
#endif

#define SHA256_CHKSUM_PREFIX "sha2:"
#define SHA512_CHKSUM_PREFIX "sha-512:"
#define ADLER32_CHKSUM_PREFIX "adler-32:"
#define SHA1_CHKSUM_PREFIX "sha1:"
int verifyChksumLocFile( char *fileName, const char *myChksum, char *chksumStr );

int
Expand Down
79 changes: 79 additions & 0 deletions lib/hasher/src/ADLER32Strategy.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#include "ADLER32Strategy.hpp"
#include "checksum.hpp"

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <string.h>
#include <boost/algorithm/string/predicate.hpp>
//#include <zlib.h>

#include "base64.h"

namespace irods {

struct adler32_parts {
uint32_t a;
uint32_t b;
};

adler32_parts adler32_init() {
return adler32_parts{1, 0};
}

static adler32_parts adler32_update(const adler32_parts& parts, const unsigned char *data, size_t len) {

const uint32_t MOD_ADLER = 65521;

uint32_t a = parts.a, b = parts.b;

// Process each byte of the data in order
for (size_t index = 0; index < len; ++index)
{
a = (a + data[index]) % MOD_ADLER;
b = (b + a) % MOD_ADLER;
}

return adler32_parts{a, b};
}

static uint32_t adler32_final(const adler32_parts& parts) {
return (parts.b << 16) | parts.a;
}


error
ADLER32Strategy::init( boost::any& _context ) const {
_context = adler32_init();
return SUCCESS();
}

error
ADLER32Strategy::update( const std::string& data, boost::any& _context ) const {

_context = adler32_update(boost::any_cast<adler32_parts>(_context), reinterpret_cast<const unsigned char*>(data.c_str()), data.size());
return SUCCESS();
}

error
ADLER32Strategy::digest( std::string& _messageDigest, boost::any& _context ) const {

const unsigned int ADLER32_DIGEST_LENGTH = 4;

uint32_t result = adler32_final(boost::any_cast<adler32_parts>(_context));

std::stringstream ss;
ss << std::setfill('0') << std::hex << std::setw(ADLER32_DIGEST_LENGTH * 2) << result;

_messageDigest = ADLER32_CHKSUM_PREFIX;
_messageDigest += ss.str();

return SUCCESS();
}

bool
ADLER32Strategy::isChecksum( const std::string& _chksum ) const {
return boost::starts_with( _chksum, ADLER32_CHKSUM_PREFIX );
}
}; // namespace irods
49 changes: 49 additions & 0 deletions lib/hasher/src/SHA1Strategy.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include "SHA1Strategy.hpp"
#include "checksum.hpp"

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <string.h>
#include <boost/algorithm/string/predicate.hpp>
#include <openssl/sha.h>

#include "base64.h"

namespace irods {

error
SHA1Strategy::init( boost::any& _context ) const {
_context = SHA_CTX();
SHA1_Init( boost::any_cast<SHA_CTX>( &_context ) );
return SUCCESS();
}

error
SHA1Strategy::update( const std::string& data, boost::any& _context ) const {
SHA1_Update( boost::any_cast<SHA_CTX>( &_context ), data.c_str(), data.size() );
return SUCCESS();
}

error
SHA1Strategy::digest( std::string& _messageDigest, boost::any& _context ) const {
unsigned char final_buffer[SHA_DIGEST_LENGTH];
SHA1_Final( final_buffer, boost::any_cast<SHA_CTX>( &_context ) );
int len = strlen( SHA1_CHKSUM_PREFIX );
unsigned long out_len = CHKSUM_LEN - len;

unsigned char out_buffer[CHKSUM_LEN];
base64_encode( final_buffer, SHA_DIGEST_LENGTH, out_buffer, &out_len );

_messageDigest = SHA1_CHKSUM_PREFIX;
_messageDigest += std::string( ( char* )out_buffer, out_len );

return SUCCESS();
}

bool
SHA1Strategy::isChecksum( const std::string& _chksum ) const {
return boost::starts_with( _chksum, SHA1_CHKSUM_PREFIX );
}
}; // namespace irods
49 changes: 49 additions & 0 deletions lib/hasher/src/SHA512Strategy.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include "SHA512Strategy.hpp"
#include "checksum.hpp"

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <string.h>
#include <boost/algorithm/string/predicate.hpp>
#include <openssl/sha.h>

#include "base64.h"

namespace irods {

error
SHA512Strategy::init( boost::any& _context ) const {
_context = SHA512_CTX();
SHA512_Init( boost::any_cast<SHA512_CTX>( &_context ) );
return SUCCESS();
}

error
SHA512Strategy::update( const std::string& data, boost::any& _context ) const {
SHA512_Update( boost::any_cast<SHA512_CTX>( &_context ), data.c_str(), data.size() );
return SUCCESS();
}

error
SHA512Strategy::digest( std::string& _messageDigest, boost::any& _context ) const {
unsigned char final_buffer[SHA512_DIGEST_LENGTH];
SHA512_Final( final_buffer, boost::any_cast<SHA512_CTX>( &_context ) );
int len = strlen( SHA512_CHKSUM_PREFIX );
unsigned long out_len = CHKSUM_LEN * 2 - len;

unsigned char out_buffer[CHKSUM_LEN * 2];
base64_encode( final_buffer, SHA512_DIGEST_LENGTH, out_buffer, &out_len );

_messageDigest = SHA512_CHKSUM_PREFIX;
_messageDigest += std::string( ( char* )out_buffer, out_len );

return SUCCESS();
}

bool
SHA512Strategy::isChecksum( const std::string& _chksum ) const {
return boost::starts_with( _chksum, SHA512_CHKSUM_PREFIX );
}
}; // namespace irods
9 changes: 9 additions & 0 deletions lib/hasher/src/irods_hasher_factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
#include "checksum.hpp"
#include "MD5Strategy.hpp"
#include "SHA256Strategy.hpp"
#include "SHA512Strategy.hpp"
#include "ADLER32Strategy.hpp"
#include "SHA1Strategy.hpp"
#include "rodsErrorTable.h"
#include <sstream>
#include <boost/unordered_map.hpp>
Expand All @@ -10,13 +13,19 @@ namespace irods {

namespace {
const SHA256Strategy _sha256;
const SHA512Strategy _sha512;
const ADLER32Strategy _adler32;
const MD5Strategy _md5;
const SHA1Strategy _sha1;

boost::unordered_map<const std::string, const HashStrategy*>
make_map() {
boost::unordered_map<const std::string, const HashStrategy*> map;
map[ SHA256_NAME ] = &_sha256;
map[ SHA512_NAME ] = &_sha512;
map[ MD5_NAME ] = &_md5;
map[ ADLER32_NAME ] = &_adler32;
map[ SHA1_NAME ] = &_sha1;
return map;
}

Expand Down
2 changes: 1 addition & 1 deletion server/api/src/rsFileChksum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ int fileChksum(

rodsLog(
LOG_DEBUG,
"fileChksum :: final_scheme [%s] chkstr_scheme [%s] svr_hash_policy [%s] hash_policy [%s]",
"fileChksum :: final_scheme [%s] chkstr_scheme [%s] hash_policy [%s]",
final_scheme.c_str(),
chkstr_scheme.c_str(),
hash_policy.c_str() );
Expand Down

0 comments on commit fa05c3a

Please sign in to comment.