/*the last public function; generates ciphertext*/ static void crypt_all (int count) { unsigned char password[PLAINTEXT_LENGTH]; unsigned char lotus_matrix[64], *lotus_matrix1, *lotus_matrix2, *lotus_matrix3, *lotus_matrix4; int i; int password_length; password_length = strlen (saved_key); memset (password, (PLAINTEXT_LENGTH - password_length), PLAINTEXT_LENGTH); lotus_matrix1 = lotus_matrix; lotus_matrix2 = lotus_matrix1 + 16; lotus_matrix3 = lotus_matrix2 + 16; lotus_matrix4 = lotus_matrix3 + 16; memcpy (password, saved_key, password_length); memset (lotus_matrix1, 0, 16); memcpy (lotus_matrix2, password, 16); memcpy (lotus_matrix3, password, 16); lotus_transform_password (lotus_matrix2, lotus_matrix4); lotus_mix (lotus_matrix); memcpy (lotus_matrix2, lotus_matrix4, 16); for (i = 0; i < 16; i++) { lotus_matrix3[i] = lotus_matrix1[i] ^ lotus_matrix2[i]; } lotus_mix (lotus_matrix); memcpy (crypt_key, lotus_matrix1, BINARY_SIZE); }
/*the last public function; generates ciphertext*/ static int crypt_all(int *pcount, struct db_salt *salt) { int count = *pcount; int index; #ifdef _OPENMP #pragma omp parallel for #endif for (index = 0; index < count; index += 2) { struct { union { unsigned char m[64]; unsigned char m4[4][16]; ARCH_WORD m4w[4][16 / ARCH_SIZE]; } u; } ctx[2]; int password_length; memset(ctx[0].u.m4[0], 0, 16); password_length = strlen(saved_key[index]); memset(ctx[0].u.m4[1], (PLAINTEXT_LENGTH - password_length), PLAINTEXT_LENGTH); memcpy(ctx[0].u.m4[1], saved_key[index], password_length); memcpy(ctx[0].u.m4[2], ctx[0].u.m4[1], 16); memset(ctx[1].u.m4[0], 0, 16); password_length = strlen(saved_key[index + 1]); memset(ctx[1].u.m4[1], (PLAINTEXT_LENGTH - password_length), PLAINTEXT_LENGTH); memcpy(ctx[1].u.m4[1], saved_key[index + 1], password_length); memcpy(ctx[1].u.m4[2], ctx[1].u.m4[1], 16); lotus_transform_password(ctx[0].u.m4[1], ctx[0].u.m4[3], ctx[1].u.m4[1], ctx[1].u.m4[3]); lotus_mix(ctx[0].u.m, ctx[1].u.m); memcpy(ctx[0].u.m4[1], ctx[0].u.m4[3], 16); memcpy(ctx[1].u.m4[1], ctx[1].u.m4[3], 16); { int i; for (i = 0; i < 16 / ARCH_SIZE; i++) { ctx[0].u.m4w[2][i] = ctx[0].u.m4w[0][i] ^ ctx[0].u.m4w[1][i]; ctx[1].u.m4w[2][i] = ctx[1].u.m4w[0][i] ^ ctx[1].u.m4w[1][i]; } } lotus_mix(ctx[0].u.m, ctx[1].u.m); memcpy(crypt_key[index], ctx[0].u.m4[0], BINARY_SIZE); memcpy(crypt_key[index + 1], ctx[1].u.m4[0], BINARY_SIZE); } return count; }