/* ChaCha20, rounds must be a multiple of 2 */ static void neoscrypt_chacha(uint *X, uint rounds) { uint x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, t; x0 = X[0]; x1 = X[1]; x2 = X[2]; x3 = X[3]; x4 = X[4]; x5 = X[5]; x6 = X[6]; x7 = X[7]; x8 = X[8]; x9 = X[9]; x10 = X[10]; x11 = X[11]; x12 = X[12]; x13 = X[13]; x14 = X[14]; x15 = X[15]; #define quarter(a,b,c,d) \ a += b; t = d ^ a; d = ROTL32(t, 16); \ c += d; t = b ^ c; b = ROTL32(t, 12); \ a += b; t = d ^ a; d = ROTL32(t, 8); \ c += d; t = b ^ c; b = ROTL32(t, 7); for(; rounds; rounds -= 2) { quarter( x0, x4, x8, x12); quarter( x1, x5, x9, x13); quarter( x2, x6, x10, x14); quarter( x3, x7, x11, x15); quarter( x0, x5, x10, x15); quarter( x1, x6, x11, x12); quarter( x2, x7, x8, x13); quarter( x3, x4, x9, x14); } X[0] += x0; X[1] += x1; X[2] += x2; X[3] += x3; X[4] += x4; X[5] += x5; X[6] += x6; X[7] += x7; X[8] += x8; X[9] += x9; X[10] += x10; X[11] += x11; X[12] += x12; X[13] += x13; X[14] += x14; X[15] += x15; #undef quarter }
/* Salsa20, rounds must be a multiple of 2 */ static void neoscrypt_salsa(uint *X, uint rounds) { uint x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, t; x0 = X[0]; x1 = X[1]; x2 = X[2]; x3 = X[3]; x4 = X[4]; x5 = X[5]; x6 = X[6]; x7 = X[7]; x8 = X[8]; x9 = X[9]; x10 = X[10]; x11 = X[11]; x12 = X[12]; x13 = X[13]; x14 = X[14]; x15 = X[15]; #define quarter(a, b, c, d) \ t = a + d; t = ROTL32(t, 7); b ^= t; \ t = b + a; t = ROTL32(t, 9); c ^= t; \ t = c + b; t = ROTL32(t, 13); d ^= t; \ t = d + c; t = ROTL32(t, 18); a ^= t; for(; rounds; rounds -= 2) { quarter( x0, x4, x8, x12); quarter( x5, x9, x13, x1); quarter(x10, x14, x2, x6); quarter(x15, x3, x7, x11); quarter( x0, x1, x2, x3); quarter( x5, x6, x7, x4); quarter(x10, x11, x8, x9); quarter(x15, x12, x13, x14); } X[0] += x0; X[1] += x1; X[2] += x2; X[3] += x3; X[4] += x4; X[5] += x5; X[6] += x6; X[7] += x7; X[8] += x8; X[9] += x9; X[10] += x10; X[11] += x11; X[12] += x12; X[13] += x13; X[14] += x14; X[15] += x15; #undef quarter }
int parse_glob_rect(t_norm_glob *g) { int tmp_len; tmp_len = 0; if (((g->g_tmp) = quarter((g->exprs)[(g->ta)] + (g->gti)[(g->ta)] + 1, &tmp_len)) != NULL) { (g->tgs)[(g->ta)][(g->gta)[(g->ta)]++] = (g->g_tmp); (g->gti)[(g->ta)] += tmp_len + 1; } else if (((g->g_tmp) = rec_g((g->exprs)[(g->ta)], &(g->gti)[(g->ta)], 0)) != NULL) (g->tgs)[(g->ta)][(g->gta)[(g->ta)]++] = (g->g_tmp); else return (FALSE); return (TRUE); }