Skip to content

Commit

Permalink
[#50] created own base64 encode/decode to resolve conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
JustinKyleJames authored and alanking committed Nov 4, 2022
1 parent 694d55f commit 7202341
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 9 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ add_library(${dsi_library_name} SHARED
${CMAKE_SOURCE_DIR}/lib/globus_hasher/src/SHA256Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/globus_hasher/src/SHA512Strategy.cpp
${CMAKE_SOURCE_DIR}/lib/globus_hasher/src/irods_hasher_factory.cpp
${CMAKE_SOURCE_DIR}/lib/globus_hasher/src/irods_globus_base64.cpp
)
add_library(${gridmap_callout_library_name} SHARED DSI/gridmap_iRODS_callout.c DSI/libirodsmap.c)

Expand Down
6 changes: 3 additions & 3 deletions DSI/globus_gridftp_server_iRODS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ extern "C" {
#include "rodsClient.h"
#endif

#include <base64.h>
#include <irods_globus_base64.hpp>

// boost includes
#include <boost/algorithm/string.hpp>
Expand Down Expand Up @@ -157,7 +157,7 @@ int convert_base64_to_hex_string(const std::string& base64_str, const int& bit_c
unsigned char out[bit_count / 8];
unsigned long out_len = bit_count / 8;

int ret = base64_decode(reinterpret_cast<const unsigned char*>(base64_str.c_str()), base64_str.size(), out, &out_len);
int ret = irods::globus::base64_decode(reinterpret_cast<const unsigned char*>(base64_str.c_str()), base64_str.size(), out, &out_len);

if (ret < 0) {
return ret;
Expand Down Expand Up @@ -1561,7 +1561,7 @@ globus_l_gfs_iRODS_command(
break;
}

char buffer_read[HASH_BUF_SZ];
char buffer_read[HASH_BUF_SZ] = {0};

openedDataObjInp_t input{};
input.l1descInx = fd;
Expand Down
11 changes: 11 additions & 0 deletions lib/globus_hasher/include/irods_globus_base64.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef IRODS_GLOBUS_BASE64_H__
#define IRODS_GLOBUS_BASE64_H__

namespace irods::globus {
int base64_encode( const unsigned char *in, unsigned long inlen,
unsigned char *out, unsigned long *outlen );
int base64_decode( const unsigned char *in, unsigned long inlen,
unsigned char *out, unsigned long *outlen );
}

#endif //IRODS_GLOBUS_BASE64_H__
4 changes: 2 additions & 2 deletions lib/globus_hasher/src/SHA1Strategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include <boost/algorithm/string/predicate.hpp>
#include <openssl/sha.h>

#include "base64.h"
#include <irods_globus_base64.hpp>

namespace irods::globus {

Expand All @@ -35,7 +35,7 @@ namespace irods::globus {
unsigned long out_len = CHKSUM_LEN - len;

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

_messageDigest = SHA1_CHKSUM_PREFIX;
_messageDigest += std::string( ( char* )out_buffer, out_len );
Expand Down
4 changes: 2 additions & 2 deletions lib/globus_hasher/src/SHA256Strategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include <boost/algorithm/string/predicate.hpp>
#include <openssl/sha.h>

#include "base64.h"
#include <irods_globus_base64.hpp>

namespace irods::globus {

Expand All @@ -35,7 +35,7 @@ namespace irods::globus {
unsigned long out_len = CHKSUM_LEN - len;

unsigned char out_buffer[CHKSUM_LEN];
base64_encode( final_buffer, SHA256_DIGEST_LENGTH, out_buffer, &out_len );
irods::globus::base64_encode( final_buffer, SHA256_DIGEST_LENGTH, out_buffer, &out_len );

_messageDigest = SHA256_CHKSUM_PREFIX;
_messageDigest += std::string( ( char* )out_buffer, out_len );
Expand Down
4 changes: 2 additions & 2 deletions lib/globus_hasher/src/SHA512Strategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include <boost/algorithm/string/predicate.hpp>
#include <openssl/sha.h>

#include "base64.h"
#include <irods_globus_base64.hpp>

namespace irods::globus {

Expand All @@ -35,7 +35,7 @@ namespace irods::globus {
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 );
irods::globus::base64_encode( final_buffer, SHA512_DIGEST_LENGTH, out_buffer, &out_len );

_messageDigest = SHA512_CHKSUM_PREFIX;
_messageDigest += std::string( ( char* )out_buffer, out_len );
Expand Down
138 changes: 138 additions & 0 deletions lib/globus_hasher/src/irods_globus_base64.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/* base64.cpp - subroutine to do base64 encoding and decoding. The code came from
* SiFang
*/

#include "rodsClient.h"
#include <irods_globus_base64.hpp>
#define OK 0

static const char *codes =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

static const unsigned char mymap[256] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255
};

/**
base64 Encode a buffer (NUL terminated)
@param in The input buffer to encode
@param inlen The length of the input buffer
@param out [out] The destination of the base64 encoded data
@param outlen [in/out] The max size and resulting size
@return OK if successful
*/
int irods::globus::base64_encode( const unsigned char *in, unsigned long inlen,
unsigned char *out, unsigned long *outlen ) {
unsigned long i, len2, leven;
unsigned char *p;

/* valid output size ? */
len2 = 4 * ( ( inlen + 2 ) / 3 );
if ( *outlen < len2 + 1 ) {
return BASE64_BUFFER_OVERFLOW;
}
p = out;
leven = 3 * ( inlen / 3 );
for ( i = 0; i < leven; i += 3 ) {
*p++ = codes[( in[0] >> 2 ) & 0x3F];
*p++ = codes[( ( ( in[0] & 3 ) << 4 ) + ( in[1] >> 4 ) ) & 0x3F];
*p++ = codes[( ( ( in[1] & 0xf ) << 2 ) + ( in[2] >> 6 ) ) & 0x3F];
*p++ = codes[in[2] & 0x3F];
in += 3;
}
/* Pad it if necessary... */
if ( i < inlen ) {
unsigned a = in[0];
unsigned b = ( i + 1 < inlen ) ? in[1] : 0;

*p++ = codes[( a >> 2 ) & 0x3F];
*p++ = codes[( ( ( a & 3 ) << 4 ) + ( b >> 4 ) ) & 0x3F];
*p++ = ( i + 1 < inlen ) ? codes[( ( ( b & 0xf ) << 2 ) ) & 0x3F] : '=';
*p++ = '=';
}

/* append a NULL byte */
*p = '\0';

/* return ok */
*outlen = p - out;
return OK;
}

/**
base64 decode a block of memory
@param in The base64 data to decode
@param inlen The length of the base64 data
@param out [out] The destination of the binary decoded data
@param outlen [in/out] The max size and resulting size of the decoded data
@return OK if successful
*/
int irods::globus::base64_decode( const unsigned char *in, unsigned long inlen,
unsigned char *out, unsigned long *outlen ) {
unsigned long t, x, y, z;
unsigned char c;
int g;

g = 3;
for ( x = y = z = t = 0; x < inlen; x++ ) {
c = mymap[in[x] & 0xFF];
if ( c == 255 ) {
continue;
}
/* the final = symbols are read and used to trim the remaining bytes */
if ( c == 254 ) {
c = 0;
/* prevent g < 0 which would potentially allow an overflow later */
if ( --g < 0 ) {
return BASE64_INVALID_PACKET;
}
}
else if ( g != 3 ) {
/* we only allow = to be at the end */
return BASE64_INVALID_PACKET;
}

t = ( t << 6 ) | c;

if ( ++y == 4 ) {
if ( z + g > *outlen ) {
return BASE64_BUFFER_OVERFLOW;
}
out[z++] = ( unsigned char )( ( t >> 16 ) & 255 );
if ( g > 1 ) {
out[z++] = ( unsigned char )( ( t >> 8 ) & 255 );
}
if ( g > 2 ) {
out[z++] = ( unsigned char )( t & 255 );
}
y = t = 0;
}
}
if ( y != 0 ) {
return BASE64_INVALID_PACKET;
}
*outlen = z;
return OK;
}

0 comments on commit 7202341

Please sign in to comment.