xref: /optee_os/core/lib/libtomcrypt/src/hashes/rmd160.c (revision 8411e6ad673d20c4742ed30c785e3f5cdea54dfa)
1*8411e6adSJerome Forissier /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2*8411e6adSJerome Forissier /* SPDX-License-Identifier: Unlicense */
35a913ee7SJerome Forissier #include "tomcrypt_private.h"
45a913ee7SJerome Forissier 
55a913ee7SJerome Forissier /**
65a913ee7SJerome Forissier    @file rmd160.c
75a913ee7SJerome Forissier    RMD160 hash function
85a913ee7SJerome Forissier */
95a913ee7SJerome Forissier 
105a913ee7SJerome Forissier /* Implementation of LTC_RIPEMD-160 based on the source by Antoon Bosselaers, ESAT-COSIC
115a913ee7SJerome Forissier  *
125a913ee7SJerome Forissier  * This source has been radically overhauled to be portable and work within
135a913ee7SJerome Forissier  * the LibTomCrypt API by Tom St Denis
145a913ee7SJerome Forissier  */
155a913ee7SJerome Forissier 
165a913ee7SJerome Forissier #ifdef LTC_RIPEMD160
175a913ee7SJerome Forissier 
185a913ee7SJerome Forissier const struct ltc_hash_descriptor rmd160_desc =
195a913ee7SJerome Forissier {
205a913ee7SJerome Forissier     "rmd160",
215a913ee7SJerome Forissier     9,
225a913ee7SJerome Forissier     20,
235a913ee7SJerome Forissier     64,
245a913ee7SJerome Forissier 
255a913ee7SJerome Forissier     /* OID */
265a913ee7SJerome Forissier    { 1, 3, 36, 3, 2, 1,  },
275a913ee7SJerome Forissier    6,
285a913ee7SJerome Forissier 
295a913ee7SJerome Forissier     &rmd160_init,
305a913ee7SJerome Forissier     &rmd160_process,
315a913ee7SJerome Forissier     &rmd160_done,
325a913ee7SJerome Forissier     &rmd160_test,
335a913ee7SJerome Forissier     NULL
345a913ee7SJerome Forissier };
355a913ee7SJerome Forissier 
365a913ee7SJerome Forissier /* the five basic functions F(), G() and H() */
375a913ee7SJerome Forissier #define F(x, y, z)        ((x) ^ (y) ^ (z))
385a913ee7SJerome Forissier #define G(x, y, z)        (((x) & (y)) | (~(x) & (z)))
395a913ee7SJerome Forissier #define H(x, y, z)        (((x) | ~(y)) ^ (z))
405a913ee7SJerome Forissier #define I(x, y, z)        (((x) & (z)) | ((y) & ~(z)))
415a913ee7SJerome Forissier #define J(x, y, z)        ((x) ^ ((y) | ~(z)))
425a913ee7SJerome Forissier 
435a913ee7SJerome Forissier /* the ten basic operations FF() through III() */
445a913ee7SJerome Forissier #define FF(a, b, c, d, e, x, s)        \
455a913ee7SJerome Forissier       (a) += F((b), (c), (d)) + (x);\
465a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
475a913ee7SJerome Forissier       (c) = ROLc((c), 10);
485a913ee7SJerome Forissier 
495a913ee7SJerome Forissier #define GG(a, b, c, d, e, x, s)        \
505a913ee7SJerome Forissier       (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
515a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
525a913ee7SJerome Forissier       (c) = ROLc((c), 10);
535a913ee7SJerome Forissier 
545a913ee7SJerome Forissier #define HH(a, b, c, d, e, x, s)        \
555a913ee7SJerome Forissier       (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
565a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
575a913ee7SJerome Forissier       (c) = ROLc((c), 10);
585a913ee7SJerome Forissier 
595a913ee7SJerome Forissier #define II(a, b, c, d, e, x, s)        \
605a913ee7SJerome Forissier       (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
615a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
625a913ee7SJerome Forissier       (c) = ROLc((c), 10);
635a913ee7SJerome Forissier 
645a913ee7SJerome Forissier #define JJ(a, b, c, d, e, x, s)        \
655a913ee7SJerome Forissier       (a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
665a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
675a913ee7SJerome Forissier       (c) = ROLc((c), 10);
685a913ee7SJerome Forissier 
695a913ee7SJerome Forissier #define FFF(a, b, c, d, e, x, s)        \
705a913ee7SJerome Forissier       (a) += F((b), (c), (d)) + (x);\
715a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
725a913ee7SJerome Forissier       (c) = ROLc((c), 10);
735a913ee7SJerome Forissier 
745a913ee7SJerome Forissier #define GGG(a, b, c, d, e, x, s)        \
755a913ee7SJerome Forissier       (a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
765a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
775a913ee7SJerome Forissier       (c) = ROLc((c), 10);
785a913ee7SJerome Forissier 
795a913ee7SJerome Forissier #define HHH(a, b, c, d, e, x, s)        \
805a913ee7SJerome Forissier       (a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
815a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
825a913ee7SJerome Forissier       (c) = ROLc((c), 10);
835a913ee7SJerome Forissier 
845a913ee7SJerome Forissier #define III(a, b, c, d, e, x, s)        \
855a913ee7SJerome Forissier       (a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
865a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
875a913ee7SJerome Forissier       (c) = ROLc((c), 10);
885a913ee7SJerome Forissier 
895a913ee7SJerome Forissier #define JJJ(a, b, c, d, e, x, s)        \
905a913ee7SJerome Forissier       (a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
915a913ee7SJerome Forissier       (a) = ROLc((a), (s)) + (e);\
925a913ee7SJerome Forissier       (c) = ROLc((c), 10);
935a913ee7SJerome Forissier 
945a913ee7SJerome Forissier 
955a913ee7SJerome Forissier #ifdef LTC_CLEAN_STACK
ss_rmd160_compress(hash_state * md,const unsigned char * buf)96*8411e6adSJerome Forissier static int ss_rmd160_compress(hash_state *md, const unsigned char *buf)
975a913ee7SJerome Forissier #else
98*8411e6adSJerome Forissier static int  s_rmd160_compress(hash_state *md, const unsigned char *buf)
995a913ee7SJerome Forissier #endif
1005a913ee7SJerome Forissier {
1015a913ee7SJerome Forissier    ulong32 aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
1025a913ee7SJerome Forissier    int i;
1035a913ee7SJerome Forissier 
1045a913ee7SJerome Forissier    /* load words X */
1055a913ee7SJerome Forissier    for (i = 0; i < 16; i++){
1065a913ee7SJerome Forissier       LOAD32L(X[i], buf + (4 * i));
1075a913ee7SJerome Forissier    }
1085a913ee7SJerome Forissier 
1095a913ee7SJerome Forissier    /* load state */
1105a913ee7SJerome Forissier    aa = aaa = md->rmd160.state[0];
1115a913ee7SJerome Forissier    bb = bbb = md->rmd160.state[1];
1125a913ee7SJerome Forissier    cc = ccc = md->rmd160.state[2];
1135a913ee7SJerome Forissier    dd = ddd = md->rmd160.state[3];
1145a913ee7SJerome Forissier    ee = eee = md->rmd160.state[4];
1155a913ee7SJerome Forissier 
1165a913ee7SJerome Forissier    /* round 1 */
1175a913ee7SJerome Forissier    FF(aa, bb, cc, dd, ee, X[ 0], 11);
1185a913ee7SJerome Forissier    FF(ee, aa, bb, cc, dd, X[ 1], 14);
1195a913ee7SJerome Forissier    FF(dd, ee, aa, bb, cc, X[ 2], 15);
1205a913ee7SJerome Forissier    FF(cc, dd, ee, aa, bb, X[ 3], 12);
1215a913ee7SJerome Forissier    FF(bb, cc, dd, ee, aa, X[ 4],  5);
1225a913ee7SJerome Forissier    FF(aa, bb, cc, dd, ee, X[ 5],  8);
1235a913ee7SJerome Forissier    FF(ee, aa, bb, cc, dd, X[ 6],  7);
1245a913ee7SJerome Forissier    FF(dd, ee, aa, bb, cc, X[ 7],  9);
1255a913ee7SJerome Forissier    FF(cc, dd, ee, aa, bb, X[ 8], 11);
1265a913ee7SJerome Forissier    FF(bb, cc, dd, ee, aa, X[ 9], 13);
1275a913ee7SJerome Forissier    FF(aa, bb, cc, dd, ee, X[10], 14);
1285a913ee7SJerome Forissier    FF(ee, aa, bb, cc, dd, X[11], 15);
1295a913ee7SJerome Forissier    FF(dd, ee, aa, bb, cc, X[12],  6);
1305a913ee7SJerome Forissier    FF(cc, dd, ee, aa, bb, X[13],  7);
1315a913ee7SJerome Forissier    FF(bb, cc, dd, ee, aa, X[14],  9);
1325a913ee7SJerome Forissier    FF(aa, bb, cc, dd, ee, X[15],  8);
1335a913ee7SJerome Forissier 
1345a913ee7SJerome Forissier    /* round 2 */
1355a913ee7SJerome Forissier    GG(ee, aa, bb, cc, dd, X[ 7],  7);
1365a913ee7SJerome Forissier    GG(dd, ee, aa, bb, cc, X[ 4],  6);
1375a913ee7SJerome Forissier    GG(cc, dd, ee, aa, bb, X[13],  8);
1385a913ee7SJerome Forissier    GG(bb, cc, dd, ee, aa, X[ 1], 13);
1395a913ee7SJerome Forissier    GG(aa, bb, cc, dd, ee, X[10], 11);
1405a913ee7SJerome Forissier    GG(ee, aa, bb, cc, dd, X[ 6],  9);
1415a913ee7SJerome Forissier    GG(dd, ee, aa, bb, cc, X[15],  7);
1425a913ee7SJerome Forissier    GG(cc, dd, ee, aa, bb, X[ 3], 15);
1435a913ee7SJerome Forissier    GG(bb, cc, dd, ee, aa, X[12],  7);
1445a913ee7SJerome Forissier    GG(aa, bb, cc, dd, ee, X[ 0], 12);
1455a913ee7SJerome Forissier    GG(ee, aa, bb, cc, dd, X[ 9], 15);
1465a913ee7SJerome Forissier    GG(dd, ee, aa, bb, cc, X[ 5],  9);
1475a913ee7SJerome Forissier    GG(cc, dd, ee, aa, bb, X[ 2], 11);
1485a913ee7SJerome Forissier    GG(bb, cc, dd, ee, aa, X[14],  7);
1495a913ee7SJerome Forissier    GG(aa, bb, cc, dd, ee, X[11], 13);
1505a913ee7SJerome Forissier    GG(ee, aa, bb, cc, dd, X[ 8], 12);
1515a913ee7SJerome Forissier 
1525a913ee7SJerome Forissier    /* round 3 */
1535a913ee7SJerome Forissier    HH(dd, ee, aa, bb, cc, X[ 3], 11);
1545a913ee7SJerome Forissier    HH(cc, dd, ee, aa, bb, X[10], 13);
1555a913ee7SJerome Forissier    HH(bb, cc, dd, ee, aa, X[14],  6);
1565a913ee7SJerome Forissier    HH(aa, bb, cc, dd, ee, X[ 4],  7);
1575a913ee7SJerome Forissier    HH(ee, aa, bb, cc, dd, X[ 9], 14);
1585a913ee7SJerome Forissier    HH(dd, ee, aa, bb, cc, X[15],  9);
1595a913ee7SJerome Forissier    HH(cc, dd, ee, aa, bb, X[ 8], 13);
1605a913ee7SJerome Forissier    HH(bb, cc, dd, ee, aa, X[ 1], 15);
1615a913ee7SJerome Forissier    HH(aa, bb, cc, dd, ee, X[ 2], 14);
1625a913ee7SJerome Forissier    HH(ee, aa, bb, cc, dd, X[ 7],  8);
1635a913ee7SJerome Forissier    HH(dd, ee, aa, bb, cc, X[ 0], 13);
1645a913ee7SJerome Forissier    HH(cc, dd, ee, aa, bb, X[ 6],  6);
1655a913ee7SJerome Forissier    HH(bb, cc, dd, ee, aa, X[13],  5);
1665a913ee7SJerome Forissier    HH(aa, bb, cc, dd, ee, X[11], 12);
1675a913ee7SJerome Forissier    HH(ee, aa, bb, cc, dd, X[ 5],  7);
1685a913ee7SJerome Forissier    HH(dd, ee, aa, bb, cc, X[12],  5);
1695a913ee7SJerome Forissier 
1705a913ee7SJerome Forissier    /* round 4 */
1715a913ee7SJerome Forissier    II(cc, dd, ee, aa, bb, X[ 1], 11);
1725a913ee7SJerome Forissier    II(bb, cc, dd, ee, aa, X[ 9], 12);
1735a913ee7SJerome Forissier    II(aa, bb, cc, dd, ee, X[11], 14);
1745a913ee7SJerome Forissier    II(ee, aa, bb, cc, dd, X[10], 15);
1755a913ee7SJerome Forissier    II(dd, ee, aa, bb, cc, X[ 0], 14);
1765a913ee7SJerome Forissier    II(cc, dd, ee, aa, bb, X[ 8], 15);
1775a913ee7SJerome Forissier    II(bb, cc, dd, ee, aa, X[12],  9);
1785a913ee7SJerome Forissier    II(aa, bb, cc, dd, ee, X[ 4],  8);
1795a913ee7SJerome Forissier    II(ee, aa, bb, cc, dd, X[13],  9);
1805a913ee7SJerome Forissier    II(dd, ee, aa, bb, cc, X[ 3], 14);
1815a913ee7SJerome Forissier    II(cc, dd, ee, aa, bb, X[ 7],  5);
1825a913ee7SJerome Forissier    II(bb, cc, dd, ee, aa, X[15],  6);
1835a913ee7SJerome Forissier    II(aa, bb, cc, dd, ee, X[14],  8);
1845a913ee7SJerome Forissier    II(ee, aa, bb, cc, dd, X[ 5],  6);
1855a913ee7SJerome Forissier    II(dd, ee, aa, bb, cc, X[ 6],  5);
1865a913ee7SJerome Forissier    II(cc, dd, ee, aa, bb, X[ 2], 12);
1875a913ee7SJerome Forissier 
1885a913ee7SJerome Forissier    /* round 5 */
1895a913ee7SJerome Forissier    JJ(bb, cc, dd, ee, aa, X[ 4],  9);
1905a913ee7SJerome Forissier    JJ(aa, bb, cc, dd, ee, X[ 0], 15);
1915a913ee7SJerome Forissier    JJ(ee, aa, bb, cc, dd, X[ 5],  5);
1925a913ee7SJerome Forissier    JJ(dd, ee, aa, bb, cc, X[ 9], 11);
1935a913ee7SJerome Forissier    JJ(cc, dd, ee, aa, bb, X[ 7],  6);
1945a913ee7SJerome Forissier    JJ(bb, cc, dd, ee, aa, X[12],  8);
1955a913ee7SJerome Forissier    JJ(aa, bb, cc, dd, ee, X[ 2], 13);
1965a913ee7SJerome Forissier    JJ(ee, aa, bb, cc, dd, X[10], 12);
1975a913ee7SJerome Forissier    JJ(dd, ee, aa, bb, cc, X[14],  5);
1985a913ee7SJerome Forissier    JJ(cc, dd, ee, aa, bb, X[ 1], 12);
1995a913ee7SJerome Forissier    JJ(bb, cc, dd, ee, aa, X[ 3], 13);
2005a913ee7SJerome Forissier    JJ(aa, bb, cc, dd, ee, X[ 8], 14);
2015a913ee7SJerome Forissier    JJ(ee, aa, bb, cc, dd, X[11], 11);
2025a913ee7SJerome Forissier    JJ(dd, ee, aa, bb, cc, X[ 6],  8);
2035a913ee7SJerome Forissier    JJ(cc, dd, ee, aa, bb, X[15],  5);
2045a913ee7SJerome Forissier    JJ(bb, cc, dd, ee, aa, X[13],  6);
2055a913ee7SJerome Forissier 
2065a913ee7SJerome Forissier    /* parallel round 1 */
2075a913ee7SJerome Forissier    JJJ(aaa, bbb, ccc, ddd, eee, X[ 5],  8);
2085a913ee7SJerome Forissier    JJJ(eee, aaa, bbb, ccc, ddd, X[14],  9);
2095a913ee7SJerome Forissier    JJJ(ddd, eee, aaa, bbb, ccc, X[ 7],  9);
2105a913ee7SJerome Forissier    JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
2115a913ee7SJerome Forissier    JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
2125a913ee7SJerome Forissier    JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
2135a913ee7SJerome Forissier    JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
2145a913ee7SJerome Forissier    JJJ(ddd, eee, aaa, bbb, ccc, X[ 4],  5);
2155a913ee7SJerome Forissier    JJJ(ccc, ddd, eee, aaa, bbb, X[13],  7);
2165a913ee7SJerome Forissier    JJJ(bbb, ccc, ddd, eee, aaa, X[ 6],  7);
2175a913ee7SJerome Forissier    JJJ(aaa, bbb, ccc, ddd, eee, X[15],  8);
2185a913ee7SJerome Forissier    JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
2195a913ee7SJerome Forissier    JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
2205a913ee7SJerome Forissier    JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
2215a913ee7SJerome Forissier    JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
2225a913ee7SJerome Forissier    JJJ(aaa, bbb, ccc, ddd, eee, X[12],  6);
2235a913ee7SJerome Forissier 
2245a913ee7SJerome Forissier    /* parallel round 2 */
2255a913ee7SJerome Forissier    III(eee, aaa, bbb, ccc, ddd, X[ 6],  9);
2265a913ee7SJerome Forissier    III(ddd, eee, aaa, bbb, ccc, X[11], 13);
2275a913ee7SJerome Forissier    III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
2285a913ee7SJerome Forissier    III(bbb, ccc, ddd, eee, aaa, X[ 7],  7);
2295a913ee7SJerome Forissier    III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
2305a913ee7SJerome Forissier    III(eee, aaa, bbb, ccc, ddd, X[13],  8);
2315a913ee7SJerome Forissier    III(ddd, eee, aaa, bbb, ccc, X[ 5],  9);
2325a913ee7SJerome Forissier    III(ccc, ddd, eee, aaa, bbb, X[10], 11);
2335a913ee7SJerome Forissier    III(bbb, ccc, ddd, eee, aaa, X[14],  7);
2345a913ee7SJerome Forissier    III(aaa, bbb, ccc, ddd, eee, X[15],  7);
2355a913ee7SJerome Forissier    III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
2365a913ee7SJerome Forissier    III(ddd, eee, aaa, bbb, ccc, X[12],  7);
2375a913ee7SJerome Forissier    III(ccc, ddd, eee, aaa, bbb, X[ 4],  6);
2385a913ee7SJerome Forissier    III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
2395a913ee7SJerome Forissier    III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
2405a913ee7SJerome Forissier    III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
2415a913ee7SJerome Forissier 
2425a913ee7SJerome Forissier    /* parallel round 3 */
2435a913ee7SJerome Forissier    HHH(ddd, eee, aaa, bbb, ccc, X[15],  9);
2445a913ee7SJerome Forissier    HHH(ccc, ddd, eee, aaa, bbb, X[ 5],  7);
2455a913ee7SJerome Forissier    HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
2465a913ee7SJerome Forissier    HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
2475a913ee7SJerome Forissier    HHH(eee, aaa, bbb, ccc, ddd, X[ 7],  8);
2485a913ee7SJerome Forissier    HHH(ddd, eee, aaa, bbb, ccc, X[14],  6);
2495a913ee7SJerome Forissier    HHH(ccc, ddd, eee, aaa, bbb, X[ 6],  6);
2505a913ee7SJerome Forissier    HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
2515a913ee7SJerome Forissier    HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
2525a913ee7SJerome Forissier    HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
2535a913ee7SJerome Forissier    HHH(ddd, eee, aaa, bbb, ccc, X[12],  5);
2545a913ee7SJerome Forissier    HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
2555a913ee7SJerome Forissier    HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
2565a913ee7SJerome Forissier    HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
2575a913ee7SJerome Forissier    HHH(eee, aaa, bbb, ccc, ddd, X[ 4],  7);
2585a913ee7SJerome Forissier    HHH(ddd, eee, aaa, bbb, ccc, X[13],  5);
2595a913ee7SJerome Forissier 
2605a913ee7SJerome Forissier    /* parallel round 4 */
2615a913ee7SJerome Forissier    GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
2625a913ee7SJerome Forissier    GGG(bbb, ccc, ddd, eee, aaa, X[ 6],  5);
2635a913ee7SJerome Forissier    GGG(aaa, bbb, ccc, ddd, eee, X[ 4],  8);
2645a913ee7SJerome Forissier    GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
2655a913ee7SJerome Forissier    GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
2665a913ee7SJerome Forissier    GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
2675a913ee7SJerome Forissier    GGG(bbb, ccc, ddd, eee, aaa, X[15],  6);
2685a913ee7SJerome Forissier    GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
2695a913ee7SJerome Forissier    GGG(eee, aaa, bbb, ccc, ddd, X[ 5],  6);
2705a913ee7SJerome Forissier    GGG(ddd, eee, aaa, bbb, ccc, X[12],  9);
2715a913ee7SJerome Forissier    GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
2725a913ee7SJerome Forissier    GGG(bbb, ccc, ddd, eee, aaa, X[13],  9);
2735a913ee7SJerome Forissier    GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
2745a913ee7SJerome Forissier    GGG(eee, aaa, bbb, ccc, ddd, X[ 7],  5);
2755a913ee7SJerome Forissier    GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
2765a913ee7SJerome Forissier    GGG(ccc, ddd, eee, aaa, bbb, X[14],  8);
2775a913ee7SJerome Forissier 
2785a913ee7SJerome Forissier    /* parallel round 5 */
2795a913ee7SJerome Forissier    FFF(bbb, ccc, ddd, eee, aaa, X[12] ,  8);
2805a913ee7SJerome Forissier    FFF(aaa, bbb, ccc, ddd, eee, X[15] ,  5);
2815a913ee7SJerome Forissier    FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
2825a913ee7SJerome Forissier    FFF(ddd, eee, aaa, bbb, ccc, X[ 4] ,  9);
2835a913ee7SJerome Forissier    FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
2845a913ee7SJerome Forissier    FFF(bbb, ccc, ddd, eee, aaa, X[ 5] ,  5);
2855a913ee7SJerome Forissier    FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
2865a913ee7SJerome Forissier    FFF(eee, aaa, bbb, ccc, ddd, X[ 7] ,  6);
2875a913ee7SJerome Forissier    FFF(ddd, eee, aaa, bbb, ccc, X[ 6] ,  8);
2885a913ee7SJerome Forissier    FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
2895a913ee7SJerome Forissier    FFF(bbb, ccc, ddd, eee, aaa, X[13] ,  6);
2905a913ee7SJerome Forissier    FFF(aaa, bbb, ccc, ddd, eee, X[14] ,  5);
2915a913ee7SJerome Forissier    FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
2925a913ee7SJerome Forissier    FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
2935a913ee7SJerome Forissier    FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
2945a913ee7SJerome Forissier    FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
2955a913ee7SJerome Forissier 
2965a913ee7SJerome Forissier    /* combine results */
2975a913ee7SJerome Forissier    ddd += cc + md->rmd160.state[1];               /* final result for md->rmd160.state[0] */
2985a913ee7SJerome Forissier    md->rmd160.state[1] = md->rmd160.state[2] + dd + eee;
2995a913ee7SJerome Forissier    md->rmd160.state[2] = md->rmd160.state[3] + ee + aaa;
3005a913ee7SJerome Forissier    md->rmd160.state[3] = md->rmd160.state[4] + aa + bbb;
3015a913ee7SJerome Forissier    md->rmd160.state[4] = md->rmd160.state[0] + bb + ccc;
3025a913ee7SJerome Forissier    md->rmd160.state[0] = ddd;
3035a913ee7SJerome Forissier 
3045a913ee7SJerome Forissier    return CRYPT_OK;
3055a913ee7SJerome Forissier }
3065a913ee7SJerome Forissier 
3075a913ee7SJerome Forissier #ifdef LTC_CLEAN_STACK
s_rmd160_compress(hash_state * md,const unsigned char * buf)308*8411e6adSJerome Forissier static int s_rmd160_compress(hash_state *md, const unsigned char *buf)
3095a913ee7SJerome Forissier {
3105a913ee7SJerome Forissier    int err;
311*8411e6adSJerome Forissier    err = ss_rmd160_compress(md, buf);
3125a913ee7SJerome Forissier    burn_stack(sizeof(ulong32) * 26 + sizeof(int));
3135a913ee7SJerome Forissier    return err;
3145a913ee7SJerome Forissier }
3155a913ee7SJerome Forissier #endif
3165a913ee7SJerome Forissier 
3175a913ee7SJerome Forissier /**
3185a913ee7SJerome Forissier    Initialize the hash state
3195a913ee7SJerome Forissier    @param md   The hash state you wish to initialize
3205a913ee7SJerome Forissier    @return CRYPT_OK if successful
3215a913ee7SJerome Forissier */
rmd160_init(hash_state * md)3225a913ee7SJerome Forissier int rmd160_init(hash_state * md)
3235a913ee7SJerome Forissier {
3245a913ee7SJerome Forissier    LTC_ARGCHK(md != NULL);
3255a913ee7SJerome Forissier    md->rmd160.state[0] = 0x67452301UL;
3265a913ee7SJerome Forissier    md->rmd160.state[1] = 0xefcdab89UL;
3275a913ee7SJerome Forissier    md->rmd160.state[2] = 0x98badcfeUL;
3285a913ee7SJerome Forissier    md->rmd160.state[3] = 0x10325476UL;
3295a913ee7SJerome Forissier    md->rmd160.state[4] = 0xc3d2e1f0UL;
3305a913ee7SJerome Forissier    md->rmd160.curlen   = 0;
3315a913ee7SJerome Forissier    md->rmd160.length   = 0;
3325a913ee7SJerome Forissier    return CRYPT_OK;
3335a913ee7SJerome Forissier }
3345a913ee7SJerome Forissier 
3355a913ee7SJerome Forissier /**
3365a913ee7SJerome Forissier    Process a block of memory though the hash
3375a913ee7SJerome Forissier    @param md     The hash state
3385a913ee7SJerome Forissier    @param in     The data to hash
3395a913ee7SJerome Forissier    @param inlen  The length of the data (octets)
3405a913ee7SJerome Forissier    @return CRYPT_OK if successful
3415a913ee7SJerome Forissier */
342*8411e6adSJerome Forissier HASH_PROCESS(rmd160_process, s_rmd160_compress, rmd160, 64)
3435a913ee7SJerome Forissier 
3445a913ee7SJerome Forissier /**
3455a913ee7SJerome Forissier    Terminate the hash to get the digest
3465a913ee7SJerome Forissier    @param md  The hash state
3475a913ee7SJerome Forissier    @param out [out] The destination of the hash (20 bytes)
3485a913ee7SJerome Forissier    @return CRYPT_OK if successful
3495a913ee7SJerome Forissier */
rmd160_done(hash_state * md,unsigned char * out)3505a913ee7SJerome Forissier int rmd160_done(hash_state * md, unsigned char *out)
3515a913ee7SJerome Forissier {
3525a913ee7SJerome Forissier     int i;
3535a913ee7SJerome Forissier 
3545a913ee7SJerome Forissier     LTC_ARGCHK(md  != NULL);
3555a913ee7SJerome Forissier     LTC_ARGCHK(out != NULL);
3565a913ee7SJerome Forissier 
3575a913ee7SJerome Forissier     if (md->rmd160.curlen >= sizeof(md->rmd160.buf)) {
3585a913ee7SJerome Forissier        return CRYPT_INVALID_ARG;
3595a913ee7SJerome Forissier     }
3605a913ee7SJerome Forissier 
3615a913ee7SJerome Forissier 
3625a913ee7SJerome Forissier     /* increase the length of the message */
3635a913ee7SJerome Forissier     md->rmd160.length += md->rmd160.curlen * 8;
3645a913ee7SJerome Forissier 
3655a913ee7SJerome Forissier     /* append the '1' bit */
3665a913ee7SJerome Forissier     md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0x80;
3675a913ee7SJerome Forissier 
3685a913ee7SJerome Forissier     /* if the length is currently above 56 bytes we append zeros
3695a913ee7SJerome Forissier      * then compress.  Then we can fall back to padding zeros and length
3705a913ee7SJerome Forissier      * encoding like normal.
3715a913ee7SJerome Forissier      */
3725a913ee7SJerome Forissier     if (md->rmd160.curlen > 56) {
3735a913ee7SJerome Forissier         while (md->rmd160.curlen < 64) {
3745a913ee7SJerome Forissier             md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0;
3755a913ee7SJerome Forissier         }
376*8411e6adSJerome Forissier         s_rmd160_compress(md, md->rmd160.buf);
3775a913ee7SJerome Forissier         md->rmd160.curlen = 0;
3785a913ee7SJerome Forissier     }
3795a913ee7SJerome Forissier 
3805a913ee7SJerome Forissier     /* pad upto 56 bytes of zeroes */
3815a913ee7SJerome Forissier     while (md->rmd160.curlen < 56) {
3825a913ee7SJerome Forissier         md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0;
3835a913ee7SJerome Forissier     }
3845a913ee7SJerome Forissier 
3855a913ee7SJerome Forissier     /* store length */
3865a913ee7SJerome Forissier     STORE64L(md->rmd160.length, md->rmd160.buf+56);
387*8411e6adSJerome Forissier     s_rmd160_compress(md, md->rmd160.buf);
3885a913ee7SJerome Forissier 
3895a913ee7SJerome Forissier     /* copy output */
3905a913ee7SJerome Forissier     for (i = 0; i < 5; i++) {
3915a913ee7SJerome Forissier         STORE32L(md->rmd160.state[i], out+(4*i));
3925a913ee7SJerome Forissier     }
3935a913ee7SJerome Forissier #ifdef LTC_CLEAN_STACK
3945a913ee7SJerome Forissier     zeromem(md, sizeof(hash_state));
3955a913ee7SJerome Forissier #endif
3965a913ee7SJerome Forissier     return CRYPT_OK;
3975a913ee7SJerome Forissier }
3985a913ee7SJerome Forissier 
3995a913ee7SJerome Forissier /**
4005a913ee7SJerome Forissier   Self-test the hash
4015a913ee7SJerome Forissier   @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
4025a913ee7SJerome Forissier */
rmd160_test(void)4035a913ee7SJerome Forissier int rmd160_test(void)
4045a913ee7SJerome Forissier {
4055a913ee7SJerome Forissier #ifndef LTC_TEST
4065a913ee7SJerome Forissier    return CRYPT_NOP;
4075a913ee7SJerome Forissier #else
4085a913ee7SJerome Forissier    static const struct {
4095a913ee7SJerome Forissier         const char *msg;
4105a913ee7SJerome Forissier         unsigned char hash[20];
4115a913ee7SJerome Forissier    } tests[] = {
4125a913ee7SJerome Forissier    { "",
4135a913ee7SJerome Forissier      { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
4145a913ee7SJerome Forissier        0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 }
4155a913ee7SJerome Forissier    },
4165a913ee7SJerome Forissier    { "a",
4175a913ee7SJerome Forissier      { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
4185a913ee7SJerome Forissier        0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe }
4195a913ee7SJerome Forissier    },
4205a913ee7SJerome Forissier    { "abc",
4215a913ee7SJerome Forissier      { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
4225a913ee7SJerome Forissier        0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc }
4235a913ee7SJerome Forissier    },
4245a913ee7SJerome Forissier    { "message digest",
4255a913ee7SJerome Forissier      { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
4265a913ee7SJerome Forissier        0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 }
4275a913ee7SJerome Forissier    },
4285a913ee7SJerome Forissier    { "abcdefghijklmnopqrstuvwxyz",
4295a913ee7SJerome Forissier      { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
4305a913ee7SJerome Forissier        0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc }
4315a913ee7SJerome Forissier    },
4325a913ee7SJerome Forissier    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
4335a913ee7SJerome Forissier      { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
4345a913ee7SJerome Forissier        0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b }
4355a913ee7SJerome Forissier    }
4365a913ee7SJerome Forissier    };
4375a913ee7SJerome Forissier 
4385a913ee7SJerome Forissier    int i;
4395a913ee7SJerome Forissier    unsigned char tmp[20];
4405a913ee7SJerome Forissier    hash_state md;
4415a913ee7SJerome Forissier 
4425a913ee7SJerome Forissier    for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
4435a913ee7SJerome Forissier        rmd160_init(&md);
444*8411e6adSJerome Forissier        rmd160_process(&md, (unsigned char *)tests[i].msg, XSTRLEN(tests[i].msg));
4455a913ee7SJerome Forissier        rmd160_done(&md, tmp);
4465a913ee7SJerome Forissier        if (compare_testvector(tmp, sizeof(tmp), tests[i].hash, sizeof(tests[i].hash), "RIPEMD160", i)) {
4475a913ee7SJerome Forissier           return CRYPT_FAIL_TESTVECTOR;
4485a913ee7SJerome Forissier        }
4495a913ee7SJerome Forissier    }
4505a913ee7SJerome Forissier    return CRYPT_OK;
4515a913ee7SJerome Forissier #endif
4525a913ee7SJerome Forissier }
4535a913ee7SJerome Forissier 
4545a913ee7SJerome Forissier #endif
4555a913ee7SJerome Forissier 
456