// ======================================================================== // Initialize the mask and rotation round subkey sets from a given user key // ------------------------------------------------------------------------ internal void CAST256KeyInit(BETA[] Kr, BETA[] Km, KAPPA userKey) { for (int i = 0; i < 12; i++) { userKey = W(2 * i, userKey, g_Tr, g_Tm); userKey = W(2 * i + 1, userKey, g_Tr, g_Tm); Kr[i].A = FIVE_LSB(userKey.A); Kr[i].B = FIVE_LSB(userKey.C); Kr[i].C = FIVE_LSB(userKey.E); Kr[i].D = FIVE_LSB(userKey.G); Km[i].A = userKey.H; Km[i].B = userKey.F; Km[i].C = userKey.D; Km[i].D = userKey.B; } }
// ======================================================================== // The Forward Octave // ------------------------------------------------------------------------ KAPPA W(int round, KAPPA data, KAPPA[] Tr, KAPPA[] Tm) { data.G = data.G ^ f1(data.H, Tr[round].A, Tm[round].A); data.F = data.F ^ f2(data.G, Tr[round].B, Tm[round].B); data.E = data.E ^ f3(data.F, Tr[round].C, Tm[round].C); data.D = data.D ^ f1(data.E, Tr[round].D, Tm[round].D); data.C = data.C ^ f2(data.D, Tr[round].E, Tm[round].E); data.B = data.B ^ f3(data.C, Tr[round].F, Tm[round].F); data.A = data.A ^ f1(data.B, Tr[round].G, Tm[round].G); data.H = data.H ^ f2(data.A, Tr[round].H, Tm[round].H); return data; }