Beispiel #1
0
        /// <summary>
        /// Get <paramref name="uRequestedCount" /> random bytes.
        /// </summary>
        /// <param name="uRequestedCount">Number of random bytes to retrieve.</param>
        /// <returns>Returns <paramref name="uRequestedCount" /> random bytes.</returns>
        public byte[] GetRandomBytes(uint uRequestedCount)
        {
            if (uRequestedCount == 0)
            {
                return(new byte[0]);
            }

            var pbRet = new byte[uRequestedCount];

            switch (_algorithm)
            {
            case CrsAlgorithm.ArcFourVariant:
                unchecked
                {
                    for (uint w = 0; w < uRequestedCount; ++w)
                    {
                        ++_i;
                        _j += _pbState[_i];

                        byte t = _pbState[_i];     // Swap entries
                        _pbState[_i] = _pbState[_j];
                        _pbState[_j] = t;

                        t        = (byte)(_pbState[_i] + _pbState[_j]);
                        pbRet[w] = _pbState[t];
                    }
                }
                break;

            case CrsAlgorithm.Salsa20:
                _salsa20.Encrypt(pbRet, pbRet.Length, false);
                break;

            default:
                throw new ArgumentException();
            }

            return(pbRet);
        }