Beispiel #1
0
        /// <summary>
        /// Creates a new instance of <see cref="ChaChaIntrinsics"/>.
        /// </summary>
        /// <param name="key">ChaCha20's key. Must have a length of 8.</param>
        /// <param name="counter">ChaCha's 64-bit block counter.</param>
        /// <param name="stream">ChaCha20's 64-bit stream id.</param>
        /// <param name="doubleRoundCount">
        /// The number of double rounds to perform. Half the total number of rounds,
        /// ex. ChaCha20 has 10 double rounds and ChaCha8 has 4 double rounds.
        /// </param>
        public static ChaChaIntrinsics Create(ReadOnlySpan <UInt32> key, UInt64 counter, UInt64 stream, UInt32 doubleRoundCount)
        {
            Debug.Assert(key.Length == 8);
            Debug.Assert(doubleRoundCount != 0);

            if (Avx2.IsSupported)
            {
                return(new ChaChaIntrinsics(ChaChaAvx2.Create(key, counter, stream, doubleRoundCount)));
            }
            if (Sse2.IsSupported)
            {
                return(new ChaChaIntrinsics(ChaChaSse2.Create(key, counter, stream, doubleRoundCount)));
            }

            return(new ChaChaIntrinsics(ChaChaSoftware.Create(key, counter, stream, doubleRoundCount)));
        }
Beispiel #2
0
 private ChaChaIntrinsics(ChaChaAvx2 avx2)
 {
     _software = null !;
     _sse2     = null !;
     _avx2     = avx2;
 }
Beispiel #3
0
 private ChaChaIntrinsics(ChaChaSse2 sse2)
 {
     _software = null !;
     _avx2     = null !;
     _sse2     = sse2;
 }
Beispiel #4
0
 private ChaChaIntrinsics(ChaChaSoftware software)
 {
     _sse2     = null !;
     _avx2     = null !;
     _software = software;
 }