Пример #1
0
        public static Tuple <int, int> ValidateTokenString(string value)
        {
            var charOffset = 0;

            try
            {
                var tokenString         = value.ToUpper();
                var splittedTokenString = tokenString.Split('-');

                // 4 parts
                if (splittedTokenString.Length != 4)
                {
                    throw new Exception();
                }

                // each part has 4 characters
                for (var i = 0; i < 4; i++)
                {
                    if (splittedTokenString[i].Length != 4)
                    {
                        throw new Exception();
                    }
                }

                // revert code to ints
                var bytes = new int[8];
                for (var i = 0; i < 2; i++)
                {
                    var nstring = splittedTokenString[2 * i];
                    var cstring = splittedTokenString[2 * i + 1];

                    for (var k = 0; k < 4; k++)
                    {
                        var number    = int.Parse(nstring[k].ToString());
                        var character = cstring[k];

                        var charValue = GetValueOfChar(character, charOffset);

                        bytes[i * 4 + k] = number * 26 + charValue;
                        if (i == 0 && k == 0)
                        {
                            // calculate char offset (first 5 bits of first value in bytes
                            var b     = TokenRing.GetBitArrayFromInt(bytes[0]);
                            var bbool = new bool[32];
                            b.CopyTo(bbool, 0);

                            var bits5 = new bool[5];
                            Array.Copy(bbool, 0, bits5, 0, 5);

                            charOffset = TokenRing.GetIntFromBitArray(new BitArray(bits5));
                        }
                    }
                }

                //revert ints to bits
                var completeRing = new TokenRing(64, 0);
                for (var i = 0; i < 8; i++)
                {
                    completeRing.AddBits(TokenRing.GetBitArrayFromInt(bytes[i]), 8);
                }

                //calculate offset
                var allBits    = completeRing.GetBits();
                var offsetBits = new bool[6];
                Array.Copy(allBits, 5, offsetBits, 0, 6);
                var offset = TokenRing.GetIntFromBitArray(new BitArray(offsetBits));

                // create ring
                var ringBits = new bool[53];
                Array.Copy(allBits, 11, ringBits, 0, 53);
                var rotateRing = new TokenRing(47, 6);
                rotateRing.AddBits(new BitArray(ringBits), 53);

                //rotate ring
                rotateRing.Rotate(-offset);

                //check validity
                if (!rotateRing.IsSealValid())
                {
                    throw new Exception();
                }

                var baseBits = rotateRing.GetBits();

                // electionId
                var electionBits = new bool[7];
                Array.Copy(baseBits, 31, electionBits, 0, 7);
                var electionId = TokenRing.GetIntFromBitArray(new BitArray(electionBits));

                // wahlkreisId
                var wahlkreisBits = new bool[9];
                Array.Copy(baseBits, 38, wahlkreisBits, 0, 9);
                var wahlkreisId = TokenRing.GetIntFromBitArray(new BitArray(wahlkreisBits));

                // check if electionId and wahlkreisId exists
                using (var context = new ElectionDBEntities())
                {
                    var election  = context.Elections.SingleOrDefault(e => e.Id == electionId);
                    var wahlkreis = context.Wahlkreis.SingleOrDefault(w => w.Id == wahlkreisId);

                    if (election == null || wahlkreis == null)
                    {
                        throw new Exception();
                    }

                    return(Tuple.Create(electionId, wahlkreisId));
                }
            }
            catch (Exception)
            {
                return(null);
            }
        }