Esempio n. 1
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;
     }
 }
Esempio n. 2
0
 public override void EmitInverse(CipherGenContext context)
 {
     Expression 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;
     }
 }
Esempio n. 3
0
		void EmitCore(CipherGenContext context) {
			Expression val = context.GetDataExpression(Index);

			context.Emit(new AssignmentStatement {
				Value = val ^ context.GetKeyExpression(Index),
				Target = val
			});
		}
Esempio n. 4
0
        private 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
                    });
                }
            }
        }
Esempio n. 5
0
		public override void EmitInverse(CipherGenContext context) {
			Expression val = context.GetDataExpression(DataIndexes[0]);
			VariableExpression tmp;
			using (context.AcquireTempVar(out 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
					});
			}
		}
Esempio n. 6
0
        public static void GeneratePair(RandomGenerator random, out StatementBlock encrypt, out StatementBlock decrypt)
        {
            double varPrecentage = 1 + ((random.NextDouble() * 2) - 1) * VARIANCE;
            var    totalElements = (int)(((random.NextDouble() + 1) * RATIO_SUM) * varPrecentage);

            var elems = new List <CryptoElement>();

            for (int i = 0; i < totalElements * MAT_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new Matrix());
            }
            for (int i = 0; i < totalElements * NUMOP_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new NumOp());
            }
            for (int i = 0; i < totalElements * SWAP_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new Swap());
            }
            for (int i = 0; i < totalElements * BINOP_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new BinOp());
            }
            for (int i = 0; i < totalElements * ROTATE_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new RotateBit());
            }
            for (int i = 0; i < 16; i++)
            {
                elems.Add(new AddKey(i));
            }
            Shuffle(random, elems);

            int[] x       = Enumerable.Range(0, 16).ToArray();
            int   index   = 16;
            bool  overdue = false;

            foreach (CryptoElement elem in elems)
            {
                elem.Initialize(random);
                for (int i = 0; i < elem.DataCount; i++)
                {
                    if (index == 16)
                    {
                        overdue = true; // Can't shuffle now to prevent duplication
                        index   = 0;
                    }
                    elem.DataIndexes[i] = x[index++];
                }
                if (overdue)
                {
                    Shuffle(random, x);
                    index   = 0;
                    overdue = false;
                }
            }

            var encryptContext = new CipherGenContext(random, 16);

            foreach (CryptoElement elem in elems)
            {
                elem.Emit(encryptContext);
            }
            encrypt = encryptContext.Block;
            PostProcessStatements(encrypt, random);

            var decryptContext = new CipherGenContext(random, 16);

            foreach (CryptoElement elem in Enumerable.Reverse(elems))
            {
                elem.EmitInverse(decryptContext);
            }
            decrypt = decryptContext.Block;
            PostProcessStatements(decrypt, random);
        }
Esempio n. 7
0
 public TempVarHolder(CipherGenContext p, Variable v)
 {
     parent = p;
     tempVar = v;
 }
 public TempVarHolder(CipherGenContext p, Variable v)
 {
     parent  = p;
     tempVar = v;
 }
Esempio n. 9
0
 public override void EmitInverse(CipherGenContext context)
 {
     EmitCore(context);
 }
Esempio n. 10
0
		public abstract void EmitInverse(CipherGenContext context);
Esempio n. 11
0
		public abstract void Emit(CipherGenContext context);
Esempio n. 12
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 });
			}
		}
Esempio n. 13
0
		public override void Emit(CipherGenContext context) {
			EmitCore(context, Key);
		}