void derive_u_ripemd160(const uint8 *key, int keyLength, const uint8 *salt, int saltLength, int iterations, uint8 *u, int b) { uint8 j[RIPEMD160_DIGESTSIZE], k[RIPEMD160_DIGESTSIZE]; uint8 init[128]; uint8 counter[4]; int c, i; /* iteration 1 */ memset(counter, 0, 4); counter[3] = (char) b; memcpy(init, salt, saltLength); /* salt */ memcpy(&init[saltLength], counter, 4); /* big-endian block number */ hmac_ripemd160(key, keyLength, init, saltLength + 4, j); memcpy(u, j, RIPEMD160_DIGESTSIZE); /* remaining iterations */ for (c = 1; c < iterations; c++) { hmac_ripemd160(key, keyLength, j, RIPEMD160_DIGESTSIZE, k); for (i = 0; i < RIPEMD160_DIGESTSIZE; i++) { u[i] ^= k[i]; j[i] = k[i]; } } /* Prevent possible leaks. */ memset(j, 0, sizeof(j)); memset(k, 0, sizeof(k)); }
void derive_u_ripemd160 (char *pwd, int pwd_len, char *salt, int salt_len, int iterations, char *u, int b) { char j[RIPEMD160_DIGESTSIZE], k[RIPEMD160_DIGESTSIZE]; char init[128]; char counter[4]; int c, i; /* iteration 1 */ memset (counter, 0, 4); counter[3] = (char) b; memcpy (init, salt, salt_len); /* salt */ memcpy (&init[salt_len], counter, 4); /* big-endian block number */ hmac_ripemd160 (pwd, pwd_len, init, salt_len + 4, j); memcpy (u, j, RIPEMD160_DIGESTSIZE); /* remaining iterations */ for (c = 1; c < iterations; c++) { hmac_ripemd160 (pwd, pwd_len, j, RIPEMD160_DIGESTSIZE, k); for (i = 0; i < RIPEMD160_DIGESTSIZE; i++) { u[i] ^= k[i]; j[i] = k[i]; } } /* Prevent possible leaks. */ burn (j, sizeof(j)); burn (k, sizeof(k)); }