MultiplyP8() 정적인 개인적인 메소드

static private MultiplyP8 ( uint x ) : void
x uint
리턴 void
        public void Init(byte[] H)
        {
            M[0]    = new uint[16][];
            M[1]    = new uint[16][];
            M[0][0] = new uint[4];
            M[1][0] = new uint[4];
            M[1][8] = GcmUtilities.AsUints(H);

            for (int j = 4; j >= 1; j >>= 1)
            {
                uint[] tmp = (uint[])M[1][j + j].Clone();
                GcmUtilities.MultiplyP(tmp);
                M[1][j] = tmp;
            }

            {
                uint[] tmp = (uint[])M[1][1].Clone();
                GcmUtilities.MultiplyP(tmp);
                M[0][8] = tmp;
            }

            for (int j = 4; j >= 1; j >>= 1)
            {
                uint[] tmp = (uint[])M[0][j + j].Clone();
                GcmUtilities.MultiplyP(tmp);
                M[0][j] = tmp;
            }

            for (int i = 0;;)
            {
                for (int j = 2; j < 16; j += j)
                {
                    for (int k = 1; k < j; ++k)
                    {
                        uint[] tmp = (uint[])M[i][j].Clone();
                        GcmUtilities.Xor(tmp, M[i][k]);
                        M[i][j + k] = tmp;
                    }
                }

                if (++i == 32)
                {
                    return;
                }

                if (i > 1)
                {
                    M[i]    = new uint[16][];
                    M[i][0] = new uint[4];
                    for (int j = 8; j > 0; j >>= 1)
                    {
                        uint[] tmp = (uint[])M[i - 2][j].Clone();
                        GcmUtilities.MultiplyP8(tmp);
                        M[i][j] = tmp;
                    }
                }
            }
        }
예제 #2
0
        public void Init(byte[] H)
        {
            M[0]    = new uint[16][];
            M[1]    = new uint[16][];
            M[0][0] = new uint[4];
            M[1][0] = new uint[4];
            M[1][8] = GcmUtilities.AsUints(H);
            for (int num = 4; num >= 1; num >>= 1)
            {
                uint[] array = (uint[])M[1][num + num].Clone();
                GcmUtilities.MultiplyP(array);
                M[1][num] = array;
            }
            uint[] array2 = (uint[])M[1][1].Clone();
            GcmUtilities.MultiplyP(array2);
            M[0][8] = array2;
            for (int num2 = 4; num2 >= 1; num2 >>= 1)
            {
                uint[] array3 = (uint[])M[0][num2 + num2].Clone();
                GcmUtilities.MultiplyP(array3);
                M[0][num2] = array3;
            }
            int num3 = 0;

            while (true)
            {
                for (int i = 2; i < 16; i += i)
                {
                    for (int j = 1; j < i; j++)
                    {
                        uint[] array4 = (uint[])M[num3][i].Clone();
                        GcmUtilities.Xor(array4, M[num3][j]);
                        M[num3][i + j] = array4;
                    }
                }
                if (++num3 == 32)
                {
                    break;
                }
                if (num3 > 1)
                {
                    M[num3]    = new uint[16][];
                    M[num3][0] = new uint[4];
                    for (int num4 = 8; num4 > 0; num4 >>= 1)
                    {
                        uint[] array5 = (uint[])M[num3 - 2][num4].Clone();
                        GcmUtilities.MultiplyP8(array5);
                        M[num3][num4] = array5;
                    }
                }
            }
        }
        public void Init(byte[] H)
        {
            this.M[0]    = new uint[16][];
            this.M[1]    = new uint[16][];
            this.M[0][0] = new uint[4];
            this.M[1][0] = new uint[4];
            this.M[1][8] = GcmUtilities.AsUints(H);
            for (int index = 4; index >= 1; index >>= 1)
            {
                uint[] x = (uint[])this.M[1][index + index].Clone();
                GcmUtilities.MultiplyP(x);
                this.M[1][index] = x;
            }
            uint[] x1 = (uint[])this.M[1][1].Clone();
            GcmUtilities.MultiplyP(x1);
            this.M[0][8] = x1;
            for (int index = 4; index >= 1; index >>= 1)
            {
                uint[] x2 = (uint[])this.M[0][index + index].Clone();
                GcmUtilities.MultiplyP(x2);
                this.M[0][index] = x2;
            }
            int index1 = 0;

label_7:
            do
            {
                for (int index2 = 2; index2 < 16; index2 += index2)
                {
                    for (int index3 = 1; index3 < index2; ++index3)
                    {
                        uint[] block = (uint[])this.M[index1][index2].Clone();
                        GcmUtilities.Xor(block, this.M[index1][index3]);
                        this.M[index1][index2 + index3] = block;
                    }
                }
                if (++index1 == 32)
                {
                    return;
                }
            }while (index1 <= 1);
            this.M[index1]    = new uint[16][];
            this.M[index1][0] = new uint[4];
            for (int index2 = 8; index2 > 0; index2 >>= 1)
            {
                uint[] x2 = (uint[])this.M[index1 - 2][index2].Clone();
                GcmUtilities.MultiplyP8(x2);
                this.M[index1][index2] = x2;
            }
            goto label_7;
        }
예제 #4
0
        public void Init(byte[] H)
        {
            if (M == null)
            {
                M = new uint[16][][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }

            this.H = Arrays.Clone(H);

            M[0]      = new uint[256][];
            M[0][0]   = new uint[4];
            M[0][128] = GcmUtilities.AsUints(H);
            for (int j = 64; j >= 1; j >>= 1)
            {
                uint[] tmp = (uint[])M[0][j + j].Clone();
                GcmUtilities.MultiplyP(tmp);
                M[0][j] = tmp;
            }
            for (int i = 0; ;)
            {
                for (int j = 2; j < 256; j += j)
                {
                    for (int k = 1; k < j; ++k)
                    {
                        uint[] tmp = (uint[])M[i][j].Clone();
                        GcmUtilities.Xor(tmp, M[i][k]);
                        M[i][j + k] = tmp;
                    }
                }

                if (++i == 16)
                {
                    return;
                }

                M[i]    = new uint[256][];
                M[i][0] = new uint[4];
                for (int j = 128; j > 0; j >>= 1)
                {
                    uint[] tmp = (uint[])M[i - 1][j].Clone();
                    GcmUtilities.MultiplyP8(tmp);
                    M[i][j] = tmp;
                }
            }
        }
예제 #5
0
        public void Init(byte[] H)
        {
            if (M == null)
            {
                M = new uint[16][][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }
            this.H    = Arrays.Clone(H);
            M[0]      = new uint[256][];
            M[0][0]   = new uint[4];
            M[0][128] = GcmUtilities.AsUints(H);
            for (int num = 64; num >= 1; num >>= 1)
            {
                uint[] array = (uint[])((global::System.Array)M[0][num + num]).Clone();
                GcmUtilities.MultiplyP(array);
                M[0][num] = array;
            }
            int num2 = 0;

            while (true)
            {
                for (int i = 2; i < 256; i += i)
                {
                    for (int j = 1; j < i; j++)
                    {
                        uint[] array2 = (uint[])((global::System.Array)M[num2][i]).Clone();
                        GcmUtilities.Xor(array2, M[num2][j]);
                        M[num2][i + j] = array2;
                    }
                }
                if (++num2 == 16)
                {
                    break;
                }
                M[num2]    = new uint[256][];
                M[num2][0] = new uint[4];
                for (int num3 = 128; num3 > 0; num3 >>= 1)
                {
                    uint[] array3 = (uint[])((global::System.Array)M[num2 - 1][num3]).Clone();
                    GcmUtilities.MultiplyP8(array3);
                    M[num2][num3] = array3;
                }
            }
        }
예제 #6
0
        public void Init(byte[] H)
        {
            if (this.M == null)
            {
                this.M = new uint[16][][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }
            this.H         = Arrays.Clone(H);
            this.M[0]      = new uint[256][];
            this.M[0][0]   = new uint[4];
            this.M[0][128] = GcmUtilities.AsUints(H);
            for (int i = 64; i >= 1; i >>= 1)
            {
                uint[] array = (uint[])this.M[0][i + i].Clone();
                GcmUtilities.MultiplyP(array);
                this.M[0][i] = array;
            }
            int num = 0;

            while (true)
            {
                for (int j = 2; j < 256; j += j)
                {
                    for (int k = 1; k < j; k++)
                    {
                        uint[] array2 = (uint[])this.M[num][j].Clone();
                        GcmUtilities.Xor(array2, this.M[num][k]);
                        this.M[num][j + k] = array2;
                    }
                }
                if (++num == 16)
                {
                    break;
                }
                this.M[num]    = new uint[256][];
                this.M[num][0] = new uint[4];
                for (int l = 128; l > 0; l >>= 1)
                {
                    uint[] array3 = (uint[])this.M[num - 1][l].Clone();
                    GcmUtilities.MultiplyP8(array3);
                    this.M[num][l] = array3;
                }
            }
        }
        public void Init(byte[] H)
        {
            if (T == null)
            {
                T = new ulong[16][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }

            this.H = Arrays.Clone(H);

            for (int i = 0; i < 16; ++i)
            {
                ulong[] t = T[i] = new ulong[512];

                // t[0] = 0

                if (i == 0)
                {
                    // t[1] = H.p^7
                    GcmUtilities.AsUlongs(this.H, t, 2);
                    GcmUtilities.MultiplyP7(t, 2, t, 2);
                }
                else
                {
                    // t[1] = T[i-1][1].p^8
                    GcmUtilities.MultiplyP8(T[i - 1], 2, t, 2);
                }

                for (int n = 2; n < 256; n += 2)
                {
                    // t[2.n] = t[n].p^-1
                    GcmUtilities.DivideP(t, n, t, n << 1);

                    // t[2.n + 1] = t[2.n] + t[1]
                    GcmUtilities.Xor(t, n << 1, t, 2, t, (n + 1) << 1);
                }
            }
        }
예제 #8
0
        public void Init(byte[] H)
        {
            if (this.M == null)
            {
                this.M = new uint[32][][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }
            this.H       = Arrays.Clone(H);
            this.M[0]    = new uint[16][];
            this.M[1]    = new uint[16][];
            this.M[0][0] = new uint[4];
            this.M[1][0] = new uint[4];
            this.M[1][8] = GcmUtilities.AsUints(H);
            for (int i = 4; i >= 1; i >>= 1)
            {
                uint[] array = (uint[])this.M[1][i + i].Clone();
                GcmUtilities.MultiplyP(array);
                this.M[1][i] = array;
            }
            uint[] array2 = (uint[])this.M[1][1].Clone();
            GcmUtilities.MultiplyP(array2);
            this.M[0][8] = array2;
            for (int j = 4; j >= 1; j >>= 1)
            {
                uint[] array3 = (uint[])this.M[0][j + j].Clone();
                GcmUtilities.MultiplyP(array3);
                this.M[0][j] = array3;
            }
            int num = 0;

            while (true)
            {
                for (int k = 2; k < 16; k += k)
                {
                    for (int l = 1; l < k; l++)
                    {
                        uint[] array4 = (uint[])this.M[num][k].Clone();
                        GcmUtilities.Xor(array4, this.M[num][l]);
                        this.M[num][k + l] = array4;
                    }
                }
                if (++num == 32)
                {
                    break;
                }
                if (num > 1)
                {
                    this.M[num]    = new uint[16][];
                    this.M[num][0] = new uint[4];
                    for (int m = 8; m > 0; m >>= 1)
                    {
                        uint[] array5 = (uint[])this.M[num - 2][m].Clone();
                        GcmUtilities.MultiplyP8(array5);
                        this.M[num][m] = array5;
                    }
                }
            }
        }
        public void Init(byte[] H)
        {
            if (this.M == null)
            {
                this.M = new uint[0x20][][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }
            this.H       = Arrays.Clone(H);
            this.M[0]    = new uint[0x10][];
            this.M[1]    = new uint[0x10][];
            this.M[0][0] = new uint[4];
            this.M[1][0] = new uint[4];
            this.M[1][8] = GcmUtilities.AsUints(H);
            for (int i = 4; i >= 1; i = i >> 1)
            {
                uint[] numArray = (uint[])this.M[1][i + i].Clone();
                GcmUtilities.MultiplyP(numArray);
                this.M[1][i] = numArray;
            }
            uint[] x = (uint[])this.M[1][1].Clone();
            GcmUtilities.MultiplyP(x);
            this.M[0][8] = x;
            for (int j = 4; j >= 1; j = j >> 1)
            {
                uint[] numArray3 = (uint[])this.M[0][j + j].Clone();
                GcmUtilities.MultiplyP(numArray3);
                this.M[0][j] = numArray3;
            }
            int index = 0;

            while (true)
            {
                for (int k = 2; k < 0x10; k += k)
                {
                    for (int m = 1; m < k; m++)
                    {
                        uint[] numArray4 = (uint[])this.M[index][k].Clone();
                        GcmUtilities.Xor(numArray4, this.M[index][m]);
                        this.M[index][k + m] = numArray4;
                    }
                }
                if (++index == 0x20)
                {
                    return;
                }
                if (index > 1)
                {
                    this.M[index]    = new uint[0x10][];
                    this.M[index][0] = new uint[4];
                    for (int m = 8; m > 0; m = m >> 1)
                    {
                        uint[] numArray5 = (uint[])this.M[index - 2][m].Clone();
                        GcmUtilities.MultiplyP8(numArray5);
                        this.M[index][m] = numArray5;
                    }
                }
            }
        }
        public void Init(byte[] H)
        {
            if (M == null)
            {
                M = new uint[32][][];
            }
            else if (Arrays.AreEqual(this.H, H))
            {
                return;
            }
            this.H  = Arrays.Clone(H);
            M[0]    = new uint[16][];
            M[1]    = new uint[16][];
            M[0][0] = new uint[4];
            M[1][0] = new uint[4];
            M[1][8] = GcmUtilities.AsUints(H);
            for (int num = 4; num >= 1; num >>= 1)
            {
                uint[] array = (uint[])((global::System.Array)M[1][num + num]).Clone();
                GcmUtilities.MultiplyP(array);
                M[1][num] = array;
            }
            uint[] array2 = (uint[])((global::System.Array)M[1][1]).Clone();
            GcmUtilities.MultiplyP(array2);
            M[0][8] = array2;
            for (int num2 = 4; num2 >= 1; num2 >>= 1)
            {
                uint[] array3 = (uint[])((global::System.Array)M[0][num2 + num2]).Clone();
                GcmUtilities.MultiplyP(array3);
                M[0][num2] = array3;
            }
            int num3 = 0;

            while (true)
            {
                for (int i = 2; i < 16; i += i)
                {
                    for (int j = 1; j < i; j++)
                    {
                        uint[] array4 = (uint[])((global::System.Array)M[num3][i]).Clone();
                        GcmUtilities.Xor(array4, M[num3][j]);
                        M[num3][i + j] = array4;
                    }
                }
                if (++num3 == 32)
                {
                    break;
                }
                if (num3 > 1)
                {
                    M[num3]    = new uint[16][];
                    M[num3][0] = new uint[4];
                    for (int num4 = 8; num4 > 0; num4 >>= 1)
                    {
                        uint[] array5 = (uint[])((global::System.Array)M[num3 - 2][num4]).Clone();
                        GcmUtilities.MultiplyP8(array5);
                        M[num3][num4] = array5;
                    }
                }
            }
        }