Beispiel #1
0
        //validates the checksum
        private static bool ValidateChecksum(IChecksum16 checksum, byte[] key)
        {
            var sum      = BitConverter.ToUInt16(key, key.Length - 2);
            var keyBytes = new byte[key.Length - 2];

            Buffer.BlockCopy(key, 0, keyBytes, 0, keyBytes.Length);
            return(sum == checksum.Compute(keyBytes));
        }
        /// <summary>
        /// Generate a key based on the given seed.
        /// </summary>
        /// <param name="seed">The seed value to generate the key from.</param>
        /// <returns>A licensing key.</returns>
        public string Generate(uint seed)
        {
            var data = new byte[(_baseKeys.Length * 4) + 4];

            // add seed
            data[0] = (byte)(seed & 0xFF);
            data[1] = (byte)(seed >> 8);
            data[2] = (byte)(seed >> 16);
            data[3] = (byte)(seed >> 24);

            //which hash function to use
            var hashOffset = 0;

            for (var i = 0; i < _baseKeys.Length; i++)
            {
                var digit = seed ^ _baseKeys[i];
                var hval  = _hashFunctions[hashOffset++].Compute((BitConverter.GetBytes(digit)));
                data[4 + (4 * i)] = (byte)(hval & 0xFF);
                data[5 + (4 * i)] = (byte)(hval >> 8);
                data[6 + (4 * i)] = (byte)(hval >> 16);
                data[7 + (4 * i)] = (byte)(hval >> 24);

                hashOffset %= _hashFunctions.Count;
            }

            var checksum = _checksum.Compute(data);
            var key      = new byte[data.Length + 2];

            Buffer.BlockCopy(data, 0, key, 0, data.Length);
            key[key.Length - 2] = (byte)(checksum & 0xFF);
            key[key.Length - 1] = (byte)(checksum >> 8);

            var ret = Base32.ToBase32(key);

            if (Spacing > 0)
            {
                var count = (ret.Length / Spacing);
                if (ret.Length % Spacing == 0)
                {
                    --count;
                }

                for (var i = 0; i < count; i++)
                {
                    ret = ret.Insert(Spacing + (i * Spacing + i), "-");
                }
            }
            return(ret);
        }