Example #1
0
        public override void EmitInverse(CipherGenContext context)
        {
            var val = context.GetDataExpression(DataIndexes[0]);

            using (context.AcquireTempVar(out var tmp))
            {
                if (IsAlternate)
                {
                    context.Emit(new AssignmentStatement
                    {
                        Value  = (val << (32 - Bits)),
                        Target = tmp
                    }).Emit(new AssignmentStatement
                    {
                        Value  = (val >> Bits) | tmp,
                        Target = val
                    });
                }
                else
                {
                    context.Emit(new AssignmentStatement
                    {
                        Value  = (val >> (32 - Bits)),
                        Target = tmp
                    }).Emit(new AssignmentStatement
                    {
                        Value  = (val << Bits) | tmp,
                        Target = val
                    });
                }
            }
        }
Example #2
0
        public override void EmitInverse(CipherGenContext context)
        {
            Expression a = context.GetDataExpression(DataIndexes[0]);
            Expression b = context.GetDataExpression(DataIndexes[1]);

            switch (Operation)
            {
            case CryptoBinOps.Add:
                context.Emit(new AssignmentStatement
                {
                    Value  = a - b,
                    Target = a
                });
                break;

            case CryptoBinOps.Xor:
                context.Emit(new AssignmentStatement
                {
                    Value  = a ^ b,
                    Target = a
                });
                break;

            case CryptoBinOps.Xnor:
                context.Emit(new AssignmentStatement
                {
                    Value  = a ^ (~b),
                    Target = a
                });
                break;
            }
        }
Example #3
0
        public override void EmitInverse(CipherGenContext context)
        {
            var val = context.GetDataExpression(DataIndexes[0]);

            switch (Operation)
            {
            case CryptoNumOps.Add:
                context.Emit(new AssignmentStatement {
                    Value  = val - (LiteralExpression)InverseKey,
                    Target = val
                });
                break;

            case CryptoNumOps.Xor:
                context.Emit(new AssignmentStatement {
                    Value  = val ^ (LiteralExpression)InverseKey,
                    Target = val
                });
                break;

            case CryptoNumOps.Mul:
                context.Emit(new AssignmentStatement {
                    Value  = val * (LiteralExpression)InverseKey,
                    Target = val
                });
                break;

            case CryptoNumOps.Xnor:
                context.Emit(new AssignmentStatement {
                    Value  = val ^ (LiteralExpression)InverseKey,
                    Target = val
                });
                break;
            }
        }
Example #4
0
        void EmitCore(CipherGenContext context)
        {
            Expression val = context.GetDataExpression(Index);

            context.Emit(new AssignmentStatement {
                Value  = val ^ context.GetKeyExpression(Index),
                Target = val
            });
        }
Example #5
0
        void EmitCore(CipherGenContext context)
        {
            Expression         a = context.GetDataExpression(DataIndexes[0]);
            Expression         b = context.GetDataExpression(DataIndexes[1]);
            VariableExpression tmp;

            if (Mask == 0xffffffff)
            {
                /*  t = a * k;
                 *  a = b;
                 *  b = t * k^-1;
                 */
                using (context.AcquireTempVar(out tmp))
                {
                    context.Emit(new AssignmentStatement
                    {
                        Value  = a * (LiteralExpression)Key,
                        Target = tmp
                    }).Emit(new AssignmentStatement
                    {
                        Value  = b,
                        Target = a
                    }).Emit(new AssignmentStatement
                    {
                        Value  = tmp * (LiteralExpression)MathsUtils.modInv(Key),
                        Target = b
                    });
                }
            }
            else
            {
                var mask    = (LiteralExpression)Mask;
                var notMask = (LiteralExpression) ~Mask;

                /*  t = (a & mask) * k;
                 *  a = a & (~mask) | (b & mask);
                 *  b = b & (~mask) | (t * k^-1);
                 */
                using (context.AcquireTempVar(out tmp))
                {
                    context.Emit(new AssignmentStatement
                    {
                        Value  = (a & mask) * (LiteralExpression)Key,
                        Target = tmp
                    }).Emit(new AssignmentStatement
                    {
                        Value  = (a & notMask) | (b & mask),
                        Target = a
                    }).Emit(new AssignmentStatement
                    {
                        Value  = (b & notMask) | (tmp * (LiteralExpression)MathsUtils.modInv(Key)),
                        Target = b
                    });
                }
            }
        }
Example #6
0
        void EmitCore(CipherGenContext context, uint[,] k)
        {
            Expression a = context.GetDataExpression(DataIndexes[0]);
            Expression b = context.GetDataExpression(DataIndexes[1]);
            Expression c = context.GetDataExpression(DataIndexes[2]);
            Expression d = context.GetDataExpression(DataIndexes[3]);

            VariableExpression ta, tb, tc, td;

            Func <uint, LiteralExpression> l = v => (LiteralExpression)v;

            using (context.AcquireTempVar(out ta))
                using (context.AcquireTempVar(out tb))
                    using (context.AcquireTempVar(out tc))
                        using (context.AcquireTempVar(out td))
                        {
                            context.Emit(new AssignmentStatement
                            {
                                Value  = a * l(k[0, 0]) + b * l(k[0, 1]) + c * l(k[0, 2]) + d * l(k[0, 3]),
                                Target = ta
                            }).Emit(new AssignmentStatement
                            {
                                Value  = a * l(k[1, 0]) + b * l(k[1, 1]) + c * l(k[1, 2]) + d * l(k[1, 3]),
                                Target = tb
                            }).Emit(new AssignmentStatement
                            {
                                Value  = a * l(k[2, 0]) + b * l(k[2, 1]) + c * l(k[2, 2]) + d * l(k[2, 3]),
                                Target = tc
                            }).Emit(new AssignmentStatement
                            {
                                Value  = a * l(k[3, 0]) + b * l(k[3, 1]) + c * l(k[3, 2]) + d * l(k[3, 3]),
                                Target = td
                            })
                            .Emit(new AssignmentStatement {
                                Value = ta, Target = a
                            })
                            .Emit(new AssignmentStatement {
                                Value = tb, Target = b
                            })
                            .Emit(new AssignmentStatement {
                                Value = tc, Target = c
                            })
                            .Emit(new AssignmentStatement {
                                Value = td, Target = d
                            });
                        }
        }
 public abstract void EmitInverse(CipherGenContext context);
 public abstract void Emit(CipherGenContext context);
Example #9
0
 public override void EmitInverse(CipherGenContext context)
 {
     EmitCore(context);
 }
Example #10
0
 public override void Emit(CipherGenContext context)
 {
     EmitCore(context, Key);
 }