Ack.
Some how the original mail from Anders was not landed in my mail box.

Thanks,
Ramesh.

On 2/28/2017 3:07 PM, A V Mahesh wrote:
>
>
>
> -------- Forwarded Message --------
> Subject:     [devel] [PATCH 1 of 1] base: Add a collision-resistant 
> hash function [#2266]
> Date:     Fri, 24 Feb 2017 15:26:55 +0100
> From:     Anders Widell <anders.wid...@ericsson.com>
> To:     ramesh.bet...@oracle.com
> CC:     opensaf-devel@lists.sourceforge.net
>
>
>
>  README                      |    2 +
>  src/base/Makefile.am        |   17 ++++--
>  src/base/hash.cc            |   28 +++++++++++
>  src/base/hash.h             |   67 +++++++++++++++++++++++++++
>  src/base/tests/hash_test.cc |  109 
> ++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 217 insertions(+), 6 deletions(-)
>
>
> Add a function that takes a string as input and returns another string 
> which is
> a hash of the input string generated using a collision-resistant hash 
> function.
>
> diff --git a/README b/README
> --- a/README
> +++ b/README
> @@ -425,6 +425,7 @@ The following software is required to bu
>
>      * libc6-dev (2.11 or later)
>      * libxml2-dev (2.7 or later)
> +    * libssl-dev (0.9.8 or later)
>      * automake (1.11.1 or later)
>      * m4
>      * autoconf (2.64 or later)
> @@ -959,6 +960,7 @@ minimum version requirements of the foll
>  - GNU C Library (Glibc), version 2.11 or later
>  - GNU Compiler Collection (GCC), version 4.8.1 or later
>  - Libxml2, version 2.7 or later
> +- Libopenssl, version 0.9.8 or later
>  - Libsqlite3, version 3.6 or later (only needed when configuring with
>    --enable-imm-pbe)
>  - OpenHPI, version 2.17.0 or later (only needed when configuring with
> diff --git a/src/base/Makefile.am b/src/base/Makefile.am
> --- a/src/base/Makefile.am
> +++ b/src/base/Makefile.am
> @@ -35,6 +35,7 @@ lib_libopensaf_core_la_SOURCES += \
>      src/base/daemon.c \
>      src/base/file_notify.cc \
>      src/base/getenv.cc \
> +    src/base/hash.cc \
>      src/base/hj_dec.c \
>      src/base/hj_edp.c \
>      src/base/hj_edu.c \
> @@ -79,6 +80,7 @@ noinst_HEADERS += \
>      src/base/daemon.h \
>      src/base/file_notify.h \
>      src/base/getenv.h \
> +    src/base/hash.h \
>      src/base/log_message.h \
>      src/base/logtrace.h \
>      src/base/macros.h \
> @@ -176,16 +178,19 @@ bin_libbase_test_CPPFLAGS = \
>
>  bin_libbase_test_LDFLAGS = \
>      $(AM_LDFLAGS) \
> -    src/base/lib_libopensaf_core_la-unix_socket.lo \
> -    src/base/lib_libopensaf_core_la-unix_server_socket.lo \
> +    -lcrypto \
> +    src/base/lib_libopensaf_core_la-file_notify.lo \
>      src/base/lib_libopensaf_core_la-getenv.lo \
> +    src/base/lib_libopensaf_core_la-hash.lo \
>      src/base/lib_libopensaf_core_la-log_message.lo \
>      src/base/lib_libopensaf_core_la-process.lo \
> -    src/base/lib_libopensaf_core_la-file_notify.lo
> +    src/base/lib_libopensaf_core_la-unix_server_socket.lo \
> +    src/base/lib_libopensaf_core_la-unix_socket.lo
>
>  bin_libbase_test_SOURCES = \
> -    src/base/tests/unix_socket_test.cc \
> +    src/base/tests/file_notify_test.cc \
>      src/base/tests/getenv_test.cc \
> +    src/base/tests/hash_test.cc \
>      src/base/tests/log_message_test.cc \
>      src/base/tests/mock_logtrace.cc \
>      src/base/tests/mock_osaf_abort.cc \
> @@ -193,8 +198,8 @@ bin_libbase_test_SOURCES = \
>      src/base/tests/time_add_test.cc \
>      src/base/tests/time_compare_test.cc \
>      src/base/tests/time_convert_test.cc \
> -    src/base/tests/file_notify_test.cc \
> -    src/base/tests/time_subtract_test.cc
> +    src/base/tests/time_subtract_test.cc \
> +    src/base/tests/unix_socket_test.cc
>
>  bin_libbase_test_LDADD = \
>      $(GTEST_DIR)/lib/libgtest.la \
> diff --git a/src/base/hash.cc b/src/base/hash.cc
> new file mode 100644
> --- /dev/null
> +++ b/src/base/hash.cc
> @@ -0,0 +1,28 @@
> +/*      -*- OpenSAF  -*-
> + *
> + * Copyright Ericsson AB 2017 - All Rights Reserved.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of 
> MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are 
> licensed
> + * under the GNU Lesser General Public License Version 2.1, February 
> 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + */
> +
> +#include "base/hash.h"
> +
> +namespace base {
> +
> +const char kHashFunctionAlphabet[64] = {
> +  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
> 'N', 'O',
> +  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 
> 'c', 'd',
> +  'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 
> 'r', 's',
> +  't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', 
> '6', '7',
> +  '8', '9', '-', '_'
> +};
> +
> +}  // namespace base
> diff --git a/src/base/hash.h b/src/base/hash.h
> new file mode 100644
> --- /dev/null
> +++ b/src/base/hash.h
> @@ -0,0 +1,67 @@
> +/*      -*- OpenSAF  -*-
> + *
> + * Copyright Ericsson AB 2017 - All Rights Reserved.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of 
> MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are 
> licensed
> + * under the GNU Lesser General Public License Version 2.1, February 
> 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + */
> +
> +#ifndef BASE_HASH_H_
> +#define BASE_HASH_H_
> +
> +#include <openssl/sha.h>
> +#include <cstdint>
> +#include <string>
> +
> +namespace base {
> +
> +extern const char kHashFunctionAlphabet[64];
> +
> +// This function takes an arbitrary string as input parameter and 
> returns
> +// another string which is a hash of the input string generated using a
> +// collision-resistant hash function. The probability that two 
> different inputs
> +// would generate the same output is small enough that it can be 
> safely ignored
> +// for all practical purposes.
> +//
> +// The return value of this function is a string of printable ASCII 
> characters.
> +// The length of the returned string will always be exactly 32 
> characters, and
> +// the returned string is guaranteed to not contain any character 
> that would be
> +// illegal for use in a file name.
> +//
> +// Note: if you use this function you need to link your program with 
> -lcrypto
> +inline std::string Hash(const std::string& message) {
> +  SHA512_CTX context;
> +  SHA512_Init(&context);
> +  context.h[0] = UINT64_C(0x010176140648b233);
> +  context.h[1] = UINT64_C(0xdb92aeb1eebadd6f);
> +  context.h[2] = UINT64_C(0x83a9e27aa1d5ea62);
> +  context.h[3] = UINT64_C(0xec95f77eb609b4e1);
> +  context.h[4] = UINT64_C(0x71a99185c75caefa);
> +  context.h[5] = UINT64_C(0x006e8f08baf32e3c);
> +  context.h[6] = UINT64_C(0x6a2b21abd2db2aec);
> +  context.h[7] = UINT64_C(0x24926cdbd918a27f);
> +  SHA512_Update(&context, message.data(), message.size());
> +  unsigned char result[SHA512_DIGEST_LENGTH];
> +  SHA512_Final(result, &context);
> +  std::string encoded;
> +  encoded.reserve(32);
> +  for (int i = 0; i != 24; i += 3) {
> +    uint64_t a = (result[i] << 16) | (result[i + 1] << 8) | result[i 
> + 2];
> +    encoded.push_back(kHashFunctionAlphabet[a >> 18]);
> +    encoded.push_back(kHashFunctionAlphabet[(a >> 12) & 63]);
> +    encoded.push_back(kHashFunctionAlphabet[(a >> 6) & 63]);
> +    encoded.push_back(kHashFunctionAlphabet[a & 63]);
> +  }
> +  return encoded;
> +}
> +
> +}  // namespace base
> +
> +#endif  // BASE_HASH_H_
> diff --git a/src/base/tests/hash_test.cc b/src/base/tests/hash_test.cc
> new file mode 100644
> --- /dev/null
> +++ b/src/base/tests/hash_test.cc
> @@ -0,0 +1,109 @@
> +/*      -*- OpenSAF  -*-
> + *
> + * Copyright Ericsson AB 2017 - All Rights Reserved.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of 
> MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are 
> licensed
> + * under the GNU Lesser General Public License Version 2.1, February 
> 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + */
> +
> +#include <endian.h>
> +#include <cstddef>
> +#include <random>
> +#include <string>
> +#include "base/hash.h"
> +#include "gtest/gtest.h"
> +
> +struct TestVector {
> +  const char* key_data;
> +  size_t key_size;
> +  const char* hash_value;
> +};
> +
> +#define TEST_VECTOR(key, hash) { key, sizeof(key) - 1, hash }
> +
> +static const TestVector test_vectors[] = {
> +  TEST_VECTOR("", "mJbyfHPNxOzI7KPhb27rY6_gS2wNOSds"),
> +  TEST_VECTOR("\000", "U-4lHisMY1zsvi2ry5wqlYKUMhhb_MX8"),
> +  TEST_VECTOR("\001", "7R0FXuGlh60oucbCoEIyp97oPDI34hNn"),
> +  TEST_VECTOR("\376", "X-7TtfTMWhw7T9CK1-yk8bRAlF_544MB"),
> +  TEST_VECTOR("\377", "OMGVy2Bhf3bPvd_yYKNVn8AK-EhkSJN4"),
> +  TEST_VECTOR(" ", "LOR-HJ8c_bFoH7LVc45B67zrxvqNp2ih"),
> +  TEST_VECTOR("\t", "jwSZSrsTHsB4kB2nUvpebPSpvDdt8d7V"),
> +  TEST_VECTOR("\n", "WlgTrOkNrltdky0QZv1B3jMG0D73h3YC"),
> +  TEST_VECTOR("\r\n", "pAv_qrHWSbOLxiJmXB2ETosp_FiE-G4H"),
> +  TEST_VECTOR("\\/:", "wyC3ktDwB4tvyzXBO5zx_iH76GKFmjxB"),
> +  TEST_VECTOR("$abc", "xSHQCvFJpVfx4ofdholD-mzgxyJJHjYg"),
> +  TEST_VECTOR("\000\000\000\000\000", 
> "mzklNJ6l6vWVe73PvthH61RRsl90ygC_"),
> +  TEST_VECTOR("123456", "E_7JXvueRDhde3Wq3W5jYSsts_LOWJNZ"),
> +  TEST_VECTOR("1234567", "0cAgD2NO2ASyz39axMrnBdV_VuHn2PhC"),
> +  TEST_VECTOR("12345678", "Uzmag7xvTQg40VBwOumXaugZxFZyRpB8"),
> +  TEST_VECTOR("123456789", "3YfQdE3kVpdmBEaBHM4uCj1feXvixjYA"),
> + 
> TEST_VECTOR("\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
> + "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
> + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
> + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
> + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
> + "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
> + "\340\341\342\343\344\345\346\347\350\351\352\353\354\355",
> +              "z2V3p2mUUigcBkYWSEw0yhz2f1v4M8Nb"),
> + 
> TEST_VECTOR("\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
> + "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
> + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
> + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
> + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
> + "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
> + "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356",
> +              "WprfN6xOSNY9RHaNCkR12yEEx5hGfwHj"),
> + 
> TEST_VECTOR("\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
> + "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
> + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
> + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
> + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
> + "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
> + "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356"
> +              "\357",
> +              "K3wQd-ZX5k7_AZ7p1qOwrehV5vkaJq9E"),
> + 
> TEST_VECTOR("\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
> + "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
> + "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
> + "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
> + "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
> + "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
> + "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"
> +              "\360",
> +              "O-ERJdo-W-iCV4b2QogLJmtR1gMIhlkx")
> +};
> +
> +TEST(BaseHash, TestVectors) {
> +  for (size_t i = 0; i < sizeof(test_vectors) / 
> sizeof(test_vectors[0]); ++i) {
> +    std::string key = std::string(test_vectors[i].key_data,
> +                                  test_vectors[i].key_size);
> +    std::string hash = std::string(test_vectors[i].hash_value);
> +    std::string computed_hash = base::Hash(key);
> +    EXPECT_EQ(hash, computed_hash);
> +  }
> +}
> +
> +TEST(BaseHash, LongRandomString) {
> +  std::string key;
> +  key.reserve(8000);
> +  std::mt19937_64 generator(4711);
> +  for (size_t i = 0; i != 1000; ++i) {
> +    union {
> +      char bytes[sizeof(uint64_t)];
> +      uint64_t word;
> +    };
> +    word = htobe64(generator());
> +    key.append(bytes, sizeof(uint64_t));
> +  }
> +  std::string hash = std::string("C_r2XVQjnVbnpQTMHO2OQJ2sn0YZi1py");
> +  std::string computed_hash = base::Hash(key);
> +  EXPECT_EQ(hash, computed_hash);
> +}
>
> ------------------------------------------------------------------------------
>  
>
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, SlashDot.org! http://sdm.link/slashdot
> _______________________________________________
> Opensaf-devel mailing list
> Opensaf-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to