Example #1
0
        // ========================================================================
        //  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;
            }
        }
Example #2
0
        // ========================================================================
        //  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;
        }