Commit a1dd3460 authored by neverlord's avatar neverlord

formatting

parent cd78bc9f
......@@ -29,126 +29,148 @@
/******************************************************************************\
* Based on http://homes.esat.kuleuven.be/~cosicart/ps/AB-9601/rmd160.c;
* original header:
*
* AUTHOR: Antoon Bosselaers, ESAT-COSIC
* DATE: 1 March 1996
* VERSION: 1.0
*
* Copyright (c) Katholieke Universiteit Leuven
* 1996, All Rights Reserved
*
* Conditions for use of the RIPEMD-160 Software
*
* The RIPEMD-160 software is freely available for use under the terms and
* conditions described hereunder, which shall be deemed to be accepted by
* any user of the software and applicable on any use of the software:
*
* 1. K.U.Leuven Department of Electrical Engineering-ESAT/COSIC shall for
* all purposes be considered the owner of the RIPEMD-160 software and of
* all copyright, trade secret, patent or other intellectual property
* rights therein.
* 2. The RIPEMD-160 software is provided on an "as is" basis without
* warranty of any sort, express or implied. K.U.Leuven makes no
* representation that the use of the software will not infringe any
* patent or proprietary right of third parties. User will indemnify
* K.U.Leuven and hold K.U.Leuven harmless from any claims or liabilities
* which may arise as a result of its use of the software. In no
* circumstances K.U.Leuven R&D will be held liable for any deficiency,
* fault or other mishappening with regard to the use or performance of
* the software.
* 3. User agrees to give due credit to K.U.Leuven in scientific publications
* or communications in relation with the use of the RIPEMD-160 software
* as follows: RIPEMD-160 software written by Antoon Bosselaers,
* available at http://www.esat.kuleuven.be/~cosicart/ps/AB-9601/.
*
* Based on http://homes.esat.kuleuven.be/~cosicart/ps/AB-9601/rmd160.c; *
* original header: *
* *
* AUTHOR: Antoon Bosselaers, ESAT-COSIC *
* DATE: 1 March 1996 *
* VERSION: 1.0 *
* *
* Copyright (c) Katholieke Universiteit Leuven *
* 1996, All Rights Reserved *
* *
* Conditions for use of the RIPEMD-160 Software *
* *
* The RIPEMD-160 software is freely available for use under the terms and *
* conditions described hereunder, which shall be deemed to be accepted by *
* any user of the software and applicable on any use of the software: *
* *
* 1. K.U.Leuven Department of Electrical Engineering-ESAT/COSIC shall for *
* all purposes be considered the owner of the RIPEMD-160 software and of *
* all copyright, trade secret, patent or other intellectual property *
* rights therein. *
* 2. The RIPEMD-160 software is provided on an "as is" basis without *
* warranty of any sort, express or implied. K.U.Leuven makes no *
* representation that the use of the software will not infringe any *
* patent or proprietary right of third parties. User will indemnify *
* K.U.Leuven and hold K.U.Leuven harmless from any claims or liabilities *
* which may arise as a result of its use of the software. In no *
* circumstances K.U.Leuven R&D will be held liable for any deficiency, *
* fault or other mishappening with regard to the use or performance of *
* the software. *
* 3. User agrees to give due credit to K.U.Leuven in scientific *
* publications or communications in relation with the use of the *
* RIPEMD-160 software as follows: RIPEMD-160 software written by *
* Antoon Bosselaers, *
* available at http://www.esat.kuleuven.be/~cosicart/ps/AB-9601/. *
* *
\******************************************************************************/
#include <cstring>
#include "cppa/util/ripemd_160.hpp"
namespace {
/* typedef 8 and 32 bit types, resp. */
/* adapt these, if necessary,
for your operating system and compiler */
// typedef 8 and 32 bit types, resp.
// adapt these, if necessary, for your operating system and compiler
typedef unsigned char byte;
typedef std::uint32_t dword;
/* macro definitions */
// macro definitions
/* collect four bytes into one word: */
// collect four bytes into one word:
#define BYTES_TO_DWORD(strptr) \
(((dword) *((strptr)+3) << 24) | \
((dword) *((strptr)+2) << 16) | \
((dword) *((strptr)+1) << 8) | \
((dword) *(strptr)))
/* ROL(x, n) cyclically rotates x over n bits to the left */
/* x must be of an unsigned 32 bits type and 0 <= n < 32. */
( \
((dword) *((strptr) + 3) << 24) | \
((dword) *((strptr) + 2) << 16) | \
((dword) *((strptr) + 1) << 8) | \
((dword) *(strptr)) \
)
// ROL(x, n) cyclically rotates x over n bits to the left
// x must be of an unsigned 32 bits type and 0 <= n < 32.
#define ROL(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* the five basic functions F(), G() and H() */
// the five basic functions F(), G() and H()
#define F(x, y, z) ((x) ^ (y) ^ (z))
#define G(x, y, z) (((x) & (y)) | (~(x) & (z)))
#define H(x, y, z) (((x) | ~(y)) ^ (z))
#define I(x, y, z) (((x) & (z)) | ((y) & ~(z)))
#define J(x, y, z) ((x) ^ ((y) | ~(z)))
/* the ten basic operations FF() through III() */
#define FF(a, b, c, d, e, x, s) {\
(a) += F((b), (c), (d)) + (x);\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
// the ten basic operations FF() through III()
#define FF(a, b, c, d, e, x, s) \
{ \
(a) += F((b), (c), (d)) + (x); \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define GG(a, b, c, d, e, x, s) {\
(a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define GG(a, b, c, d, e, x, s) \
{ \
(a) += G((b), (c), (d)) + (x) + 0x5a827999UL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define HH(a, b, c, d, e, x, s) {\
(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define HH(a, b, c, d, e, x, s) \
{ \
(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define II(a, b, c, d, e, x, s) {\
(a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define II(a, b, c, d, e, x, s) \
{ \
(a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define JJ(a, b, c, d, e, x, s) {\
(a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define JJ(a, b, c, d, e, x, s) \
{ \
(a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define FFF(a, b, c, d, e, x, s) {\
(a) += F((b), (c), (d)) + (x);\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define FFF(a, b, c, d, e, x, s) \
{ \
(a) += F((b), (c), (d)) + (x); \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define GGG(a, b, c, d, e, x, s) {\
(a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define GGG(a, b, c, d, e, x, s) \
{ \
(a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define HHH(a, b, c, d, e, x, s) {\
(a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define HHH(a, b, c, d, e, x, s) \
{ \
(a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define III(a, b, c, d, e, x, s) {\
(a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define III(a, b, c, d, e, x, s) \
{ \
(a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
#define JJJ(a, b, c, d, e, x, s) {\
(a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
(a) = ROL((a), (s)) + (e);\
(c) = ROL((c), 10);\
#define JJJ(a, b, c, d, e, x, s) \
{ \
(a) += J((b), (c), (d)) + (x) + 0x50a28be6UL; \
(a) = ROL((a), (s)) + (e); \
(c) = ROL((c), 10); \
}
void MDinit(dword *MDbuf)
void MDinit(dword* MDbuf)
{
MDbuf[0] = 0x67452301UL;
MDbuf[1] = 0xefcdab89UL;
......@@ -157,14 +179,21 @@ void MDinit(dword *MDbuf)
MDbuf[4] = 0xc3d2e1f0UL;
}
void compress(dword *MDbuf, dword *X)
void compress(dword* MDbuf, dword* X)
{
dword aa = MDbuf[0], bb = MDbuf[1], cc = MDbuf[2],
dd = MDbuf[3], ee = MDbuf[4];
dword aaa = MDbuf[0], bbb = MDbuf[1], ccc = MDbuf[2],
ddd = MDbuf[3], eee = MDbuf[4];
/* round 1 */
// round 1-5 variables
dword aa = MDbuf[0];
dword bb = MDbuf[1];
dword cc = MDbuf[2];
dword dd = MDbuf[3];
dword ee = MDbuf[4];
// parallel round 1-5 variables
dword aaa = MDbuf[0];
dword bbb = MDbuf[1];
dword ccc = MDbuf[2];
dword ddd = MDbuf[3];
dword eee = MDbuf[4];
// round 1
FF(aa, bb, cc, dd, ee, X[ 0], 11);
FF(ee, aa, bb, cc, dd, X[ 1], 14);
FF(dd, ee, aa, bb, cc, X[ 2], 15);
......@@ -181,8 +210,7 @@ void compress(dword *MDbuf, dword *X)
FF(cc, dd, ee, aa, bb, X[13], 7);
FF(bb, cc, dd, ee, aa, X[14], 9);
FF(aa, bb, cc, dd, ee, X[15], 8);
/* round 2 */
// round 2
GG(ee, aa, bb, cc, dd, X[ 7], 7);
GG(dd, ee, aa, bb, cc, X[ 4], 6);
GG(cc, dd, ee, aa, bb, X[13], 8);
......@@ -199,8 +227,7 @@ void compress(dword *MDbuf, dword *X)
GG(bb, cc, dd, ee, aa, X[14], 7);
GG(aa, bb, cc, dd, ee, X[11], 13);
GG(ee, aa, bb, cc, dd, X[ 8], 12);
/* round 3 */
// round 3
HH(dd, ee, aa, bb, cc, X[ 3], 11);
HH(cc, dd, ee, aa, bb, X[10], 13);
HH(bb, cc, dd, ee, aa, X[14], 6);
......@@ -217,8 +244,7 @@ void compress(dword *MDbuf, dword *X)
HH(aa, bb, cc, dd, ee, X[11], 12);
HH(ee, aa, bb, cc, dd, X[ 5], 7);
HH(dd, ee, aa, bb, cc, X[12], 5);
/* round 4 */
// round 4
II(cc, dd, ee, aa, bb, X[ 1], 11);
II(bb, cc, dd, ee, aa, X[ 9], 12);
II(aa, bb, cc, dd, ee, X[11], 14);
......@@ -235,8 +261,7 @@ void compress(dword *MDbuf, dword *X)
II(ee, aa, bb, cc, dd, X[ 5], 6);
II(dd, ee, aa, bb, cc, X[ 6], 5);
II(cc, dd, ee, aa, bb, X[ 2], 12);
/* round 5 */
// round 5
JJ(bb, cc, dd, ee, aa, X[ 4], 9);
JJ(aa, bb, cc, dd, ee, X[ 0], 15);
JJ(ee, aa, bb, cc, dd, X[ 5], 5);
......@@ -253,8 +278,7 @@ void compress(dword *MDbuf, dword *X)
JJ(dd, ee, aa, bb, cc, X[ 6], 8);
JJ(cc, dd, ee, aa, bb, X[15], 5);
JJ(bb, cc, dd, ee, aa, X[13], 6);
/* parallel round 1 */
// parallel round 1
JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
......@@ -271,8 +295,7 @@ void compress(dword *MDbuf, dword *X)
JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
/* parallel round 2 */
// parallel round 2
III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
III(ddd, eee, aaa, bbb, ccc, X[11], 13);
III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
......@@ -289,8 +312,7 @@ void compress(dword *MDbuf, dword *X)
III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
/* parallel round 3 */
// parallel round 3
HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
......@@ -307,8 +329,7 @@ void compress(dword *MDbuf, dword *X)
HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
/* parallel round 4 */
// parallel round 4
GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
......@@ -325,8 +346,7 @@ void compress(dword *MDbuf, dword *X)
GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
/* parallel round 5 */
// parallel round 5
FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
......@@ -343,65 +363,56 @@ void compress(dword *MDbuf, dword *X)
FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
/* combine results */
ddd += cc + MDbuf[1]; /* final result for MDbuf[0] */
// combine results
ddd += cc + MDbuf[1]; // final result for MDbuf[0]
MDbuf[1] = MDbuf[2] + dd + eee;
MDbuf[2] = MDbuf[3] + ee + aaa;
MDbuf[3] = MDbuf[4] + aa + bbb;
MDbuf[4] = MDbuf[0] + bb + ccc;
MDbuf[0] = ddd;
return;
}
void MDfinish(dword *MDbuf, const byte *strptr, dword lswlen, dword mswlen)
{
unsigned int i; /* counter */
dword X[16]; /* message words */
dword X[16]; // message words
memset(X, 0, 16 * sizeof(dword));
/* put bytes from strptr into X */
for (i=0; i<(lswlen&63); i++) {
/* byte i goes into word X[i div 4] at pos. 8*(i mod 4) */
// put bytes from strptr into X
for (unsigned int i = 0; i < (lswlen & 63); ++i)
{
// byte i goes into word X[i div 4] at pos. 8*(i mod 4)
X[i>>2] ^= (dword) *strptr++ << (8 * (i&3));
}
/* append the bit m_n == 1 */
// append the bit m_n == 1
X[(lswlen>>2)&15] ^= (dword)1 << (8*(lswlen&3) + 7);
if ((lswlen & 63) > 55) {
/* length goes to next block */
if ((lswlen & 63) > 55)
{
// length goes to next block
compress(MDbuf, X);
memset(X, 0, 16*sizeof(dword));
}
/* append length in bits*/
// append length in bits
X[14] = lswlen << 3;
X[15] = (lswlen >> 29) | (mswlen << 3);
compress(MDbuf, X);
return;
}
} // namespace <anonmyous>
namespace cppa { namespace util {
void ripemd_160(std::array<std::uint8_t, 20>& storage, const std::string& data)
void ripemd_160(std::array<std::uint8_t, 20>& storage, std::string const& data)
{
dword MDbuf[5]; /* contains (A, B, C, D(, E)) */
dword X[16]; /* current 16-word chunk */
dword length; /* length in bytes of message */
dword MDbuf[5]; // contains (A, B, C, D(, E))
dword X[16]; // current 16-word chunk
dword length; // length in bytes of message
auto message = reinterpret_cast<const unsigned char*>(data.c_str());
/* initialize */
// initialize
MDinit(MDbuf);
length = data.size();
/* process message in 16-word chunks */
// process message in 16-word chunks
for (dword nbytes = length; nbytes > 63; nbytes -= 64)
{
for (dword i = 0; i < 16; ++i)
......@@ -411,16 +422,16 @@ void ripemd_160(std::array<std::uint8_t, 20>& storage, const std::string& data)
}
compress(MDbuf, X);
}
/* length mod 64 bytes left */
// length mod 64 bytes left
/* finish: */
// finish:
MDfinish(MDbuf, message, length, 0);
for (size_t i = 0; i < storage.size(); i += 4)
{
storage[i] = MDbuf[i>>2]; /* implicit cast to byte */
storage[i+1] = (MDbuf[i>>2] >> 8); /* extracts the 8 least */
storage[i+2] = (MDbuf[i>>2] >> 16); /* significant bits. */
storage[i] = MDbuf[i>>2]; // implicit cast to byte
storage[i+1] = (MDbuf[i>>2] >> 8); // extracts the 8 least
storage[i+2] = (MDbuf[i>>2] >> 16); // significant bits.
storage[i+3] = (MDbuf[i>>2] >> 24);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment