1c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompackage org.bouncycastle.crypto.modes.gcm;
2c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport org.bouncycastle.crypto.util.Pack;
46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.util.Arrays;
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
6c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromabstract class GCMUtil
7c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom{
85db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static final int E1 = 0xe1000000;
95db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static final byte E1B = (byte)0xe1;
105db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static final long E1L = (E1 & 0xFFFFFFFFL) << 24;
115db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
125db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static int[] generateLookup()
135db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
145db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int[] lookup = new int[256];
155db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
165db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        for (int c = 0; c < 256; ++c)
175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        {
185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            int v = 0;
195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            for (int i = 7; i >= 0; --i)
205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            {
215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                if ((c & (1 << i)) != 0)
225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                {
235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    v ^= (E1 >>> (7 - i));
245db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                }
255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            }
265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            lookup[c] = v;
275db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        }
285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
295db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return lookup;
305db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
315db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
325db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static final int[] LOOKUP = generateLookup();
335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    static byte[] oneAsBytes()
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        byte[] tmp = new byte[16];
376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        tmp[0] = (byte)0x80;
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return tmp;
396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    static int[] oneAsInts()
426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        int[] tmp = new int[4];
445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        tmp[0] = 1 << 31;
455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return tmp;
465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static long[] oneAsLongs()
495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long[] tmp = new long[2];
515db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        tmp[0] = 1L << 63;
526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return tmp;
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
555db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static byte[] asBytes(int[] x)
565db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
575db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        byte[] z = new byte[16];
585db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.intToBigEndian(x, z, 0);
595db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return z;
605db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
615db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void asBytes(int[] x, byte[] z)
635db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
645db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.intToBigEndian(x, z, 0);
655db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
665db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
675db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static byte[] asBytes(long[] x)
685db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
695db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        byte[] z = new byte[16];
705db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.longToBigEndian(x, z, 0);
715db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return z;
725db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
735db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
745db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void asBytes(long[] x, byte[] z)
755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.longToBigEndian(x, z, 0);
775db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
785db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
795db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static int[] asInts(byte[] x)
805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
815db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int[] z = new int[4];
825db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.bigEndianToInt(x, 0, z);
835db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return z;
845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
865db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void asInts(byte[] x, int[] z)
8770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
885db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.bigEndianToInt(x, 0, z);
8970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
9070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
915db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static long[] asLongs(byte[] x)
92c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
935db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long[] z = new long[2];
945db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.bigEndianToLong(x, 0, z);
955db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return z;
9670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
9770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
985db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void asLongs(byte[] x, long[] z)
9970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
1005db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Pack.bigEndianToLong(x, 0, z);
101c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
102c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1035db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void multiply(byte[] x, byte[] y)
1046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1055db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        byte[] r0 = Arrays.clone(x);
1065db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        byte[] r1 = new byte[16];
1076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (int i = 0; i < 16; ++i)
1096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
1105db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            byte bits = y[i];
1116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            for (int j = 7; j >= 0; --j)
1126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
1136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                if ((bits & (1 << j)) != 0)
1146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
1155db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    xor(r1, r0);
1166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
1176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                if (shiftRight(r0) != 0)
1196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
1205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    r0[0] ^= E1B;
1216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
1226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
1236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
1246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        System.arraycopy(r1, 0, x, 0, 16);
1265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
1275db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void multiply(int[] x, int[] y)
1295db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
1305db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int[] r0 = Arrays.clone(x);
1315db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int[] r1 = new int[4];
1325db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        for (int i = 0; i < 4; ++i)
1345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        {
1355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            int bits = y[i];
1365db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            for (int j = 31; j >= 0; --j)
1375db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            {
1385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                if ((bits & (1 << j)) != 0)
1395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                {
1405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    xor(r1, r0);
1415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                }
1425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                if (shiftRight(r0) != 0)
1445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                {
1455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    r0[0] ^= E1;
1465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                }
1475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            }
1485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        }
1495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        System.arraycopy(r1, 0, x, 0, 4);
1515db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
1525db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1535db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void multiply(long[] x, long[] y)
1545db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
1555db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long[] r0 = new long[]{ x[0], x[1] };
1565db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long[] r1 = new long[2];
1575db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1585db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        for (int i = 0; i < 2; ++i)
1595db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        {
1605db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            long bits = y[i];
1615db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            for (int j = 63; j >= 0; --j)
1625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            {
1635db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                if ((bits & (1L << j)) != 0)
1645db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                {
1655db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    xor(r1, r0);
1665db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                }
1675db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1685db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                if (shiftRight(r0) != 0)
1695db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                {
1705db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                    r0[0] ^= E1L;
1715db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root                }
1725db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            }
1735db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        }
1745db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] = r1[0];
1765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[1] = r1[1];
1776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
179c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    // P is the value with only bit i=1 set
180c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    static void multiplyP(int[] x)
181c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
1825db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        if (shiftRight(x) != 0)
183c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
1845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[0] ^= E1;
185c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
186c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
187c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
1885db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void multiplyP(int[] x, int[] y)
18970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
1905db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        if (shiftRight(x, y) != 0)
19170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        {
1925db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            y[0] ^= E1;
19370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        }
19470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
19570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
19670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    // P is the value with only bit i=1 set
197c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    static void multiplyP8(int[] x)
198c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
1994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom//        for (int i = 8; i != 0; --i)
2004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom//        {
2014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom//            multiplyP(x);
2024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom//        }
2034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2045db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int c = shiftRightN(x, 8);
2055db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] ^= LOOKUP[c >>> 24];
206c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
207c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
2085db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void multiplyP8(int[] x, int[] y)
20970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
2105db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int c = shiftRightN(x, 8, y);
2115db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        y[0] ^= LOOKUP[c >>> 24];
21270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
21370c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
2145db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static byte shiftRight(byte[] x)
215c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
2165db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        int c = 0;
2175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        for (int i = 0; i < 16; ++i)
2185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        {
2195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            int b = x[i] & 0xff;
2205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            x[i] = (byte)((b >>> 1) | c);
2215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            c = (b & 1) << 7;
2225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        }
2235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        return (byte)c;
2245db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
2255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int i = 0, c = 0;
2265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        do
227c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
2285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            int b = x[i] & 0xff;
2295db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i++] = (byte)((b >>> 1) | c);
2305db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
2315db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            b = x[i] & 0xff;
2325db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i++] = (byte)((b >>> 1) | c);
2335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
2345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            b = x[i] & 0xff;
2355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i++] = (byte)((b >>> 1) | c);
2365db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
2375db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            b = x[i] & 0xff;
2385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i++] = (byte)((b >>> 1) | c);
2395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
240c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
2415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (i < 16);
2425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return (byte)c;
243c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
244c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
2455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static byte shiftRight(byte[] x, byte[] z)
24670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
2475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        int c = 0;
2485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        for (int i = 0; i < 16; ++i)
2495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        {
2505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            int b = x[i] & 0xff;
2515db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            z[i] = (byte) ((b >>> 1) | c);
2525db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            c = (b & 1) << 7;
2535db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        }
2545db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        return (byte) c;
2555db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
2565db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int i = 0, c = 0;
2575db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        do
25870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        {
2595db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            int b = x[i] & 0xff;
2605db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i++] = (byte)((b >>> 1) | c);
2615db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
2625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            b = x[i] & 0xff;
2635db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i++] = (byte)((b >>> 1) | c);
2645db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
2655db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            b = x[i] & 0xff;
2665db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i++] = (byte)((b >>> 1) | c);
2675db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
2685db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            b = x[i] & 0xff;
2695db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i++] = (byte)((b >>> 1) | c);
2705db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            c = (b & 1) << 7;
27170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        }
2725db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (i < 16);
2735db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return (byte)c;
27470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
27570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
2765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static int shiftRight(int[] x)
277c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
2785db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        int c = 0;
2795db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        for (int i = 0; i < 4; ++i)
2805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        {
2815db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            int b = x[i];
2825db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            x[i] = (b >>> 1) | c;
2835db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            c = b << 31;
2845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        }
2855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        return c;
2865db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
2875db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int b = x[0];
2885db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] = b >>> 1;
2895db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int c = b << 31;
2905db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[1];
2915db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[1] = (b >>> 1) | c;
2925db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << 31;
2935db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[2];
2945db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[2] = (b >>> 1) | c;
2955db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << 31;
2965db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[3];
2975db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[3] = (b >>> 1) | c;
2985db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return b << 31;
299c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
300c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
3015db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static int shiftRight(int[] x, int[] z)
30270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
3035db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//      int c = 0;
3045db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//      for (int i = 0; i < 4; ++i)
3055db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//      {
3065db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//          int b = x[i];
3075db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//          z[i] = (b >>> 1) | c;
3085db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//          c = b << 31;
3095db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//      }
3105db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//      return c;
3115db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
3125db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int b = x[0];
3135db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[0] = b >>> 1;
3145db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int c = b << 31;
3155db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[1];
3165db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[1] = (b >>> 1) | c;
3175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << 31;
3185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[2];
3195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[2] = (b >>> 1) | c;
3205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << 31;
3215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[3];
3225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[3] = (b >>> 1) | c;
3235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return b << 31;
32470c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
32570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
3265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static long shiftRight(long[] x)
3274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
3285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long b = x[0];
3295db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] = b >>> 1;
3305db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long c = b << 63;
3315db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[1];
3325db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[1] = (b >>> 1) | c;
3335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return b << 63;
3345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
3355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
3365db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static long shiftRight(long[] x, long[] z)
3375db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
3385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long b = x[0];
3395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[0] = b >>> 1;
3405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        long c = b << 63;
3415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[1];
3425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[1] = (b >>> 1) | c;
3435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return b << 63;
3445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
3455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
3465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static int shiftRightN(int[] x, int n)
3475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
3485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        int c = 0, nInv = 32 - n;
3495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        for (int i = 0; i < 4; ++i)
3505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        {
3515db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            int b = x[i];
3525db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            x[i] = (b >>> n) | c;
3535db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            c = b << nInv;
3545db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        }
3555db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        return c;
3565db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
3575db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int b = x[0], nInv = 32 - n;
3585db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] = b >>> n;
3595db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int c = b << nInv;
3605db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[1];
3615db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[1] = (b >>> n) | c;
3625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << nInv;
3635db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[2];
3645db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[2] = (b >>> n) | c;
3655db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << nInv;
3665db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[3];
3675db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[3] = (b >>> n) | c;
3685db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return b << nInv;
3694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
3704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
3715db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static int shiftRightN(int[] x, int n, int[] z)
3725db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
3735db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        int c = 0, nInv = 32 - n;
3745db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        for (int i = 0; i < 4; ++i)
3755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        {
3765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            int b = x[i];
3775db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            z[i] = (b >>> n) | c;
3785db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//            c = b << nInv;
3795db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        }
3805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root//        return c;
3815db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
3825db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int b = x[0], nInv = 32 - n;
3835db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[0] = b >>> n;
3845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int c = b << nInv;
3855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[1];
3865db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[1] = (b >>> n) | c;
3875db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << nInv;
3885db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[2];
3895db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[2] = (b >>> n) | c;
3905db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        c = b << nInv;
3915db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        b = x[3];
3925db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[3] = (b >>> n) | c;
3935db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return b << nInv;
3945db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
3955db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
3965db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(byte[] x, byte[] y)
39770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
39870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        int i = 0;
3995db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        do
40070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        {
4015db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i] ^= y[i]; ++i;
4025db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i] ^= y[i]; ++i;
4035db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i] ^= y[i]; ++i;
4045db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[i] ^= y[i]; ++i;
40570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        }
4065db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (i < 16);
40770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
40870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
4095db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(byte[] x, byte[] y, int yOff, int yLen)
410c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
4115db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (yLen-- > 0)
412c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
4135db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            x[yLen] ^= y[yOff + yLen];
414c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
415c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
416c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
4175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(byte[] x, byte[] y, byte[] z)
41870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
4195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        int i = 0;
4205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        do
42170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        {
4225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i] = (byte)(x[i] ^ y[i]); ++i;
4235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i] = (byte)(x[i] ^ y[i]); ++i;
4245db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i] = (byte)(x[i] ^ y[i]); ++i;
4255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            z[i] = (byte)(x[i] ^ y[i]); ++i;
42670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        }
4275db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (i < 16);
42870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
42970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
4305db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(int[] x, int[] y)
43170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
4325db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] ^= y[0];
4335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[1] ^= y[1];
4345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[2] ^= y[2];
4355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[3] ^= y[3];
43670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
43770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
4385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(int[] x, int[] y, int[] z)
439c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
4405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[0] = x[0] ^ y[0];
4415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[1] = x[1] ^ y[1];
4425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[2] = x[2] ^ y[2];
4435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[3] = x[3] ^ y[3];
444c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
44570c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
4465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(long[] x, long[] y)
44770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
4485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[0] ^= y[0];
4495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        x[1] ^= y[1];
4505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
4515db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
4525db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    static void xor(long[] x, long[] y, long[] z)
4535db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
4545db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[0] = x[0] ^ y[0];
4555db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        z[1] = x[1] ^ y[1];
45670c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
457c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom}
458