Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/humla-spongycastle.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/test/java/org/bouncycastle/crypto/test/GCMReorderTest.java')
-rw-r--r--core/src/test/java/org/bouncycastle/crypto/test/GCMReorderTest.java347
1 files changed, 0 insertions, 347 deletions
diff --git a/core/src/test/java/org/bouncycastle/crypto/test/GCMReorderTest.java b/core/src/test/java/org/bouncycastle/crypto/test/GCMReorderTest.java
deleted file mode 100644
index efac338f..00000000
--- a/core/src/test/java/org/bouncycastle/crypto/test/GCMReorderTest.java
+++ /dev/null
@@ -1,347 +0,0 @@
-package org.bouncycastle.crypto.test;
-
-import java.io.IOException;
-import java.security.SecureRandom;
-
-import junit.framework.TestCase;
-import org.bouncycastle.crypto.modes.gcm.GCMExponentiator;
-import org.bouncycastle.crypto.modes.gcm.GCMMultiplier;
-import org.bouncycastle.crypto.modes.gcm.Tables1kGCMExponentiator;
-import org.bouncycastle.crypto.modes.gcm.Tables64kGCMMultiplier;
-import org.bouncycastle.util.Arrays;
-import org.bouncycastle.util.Pack;
-import org.bouncycastle.util.encoders.Hex;
-
-public class GCMReorderTest
- extends TestCase
-{
- private static final byte[] H;
- private static final SecureRandom random = new SecureRandom();
- private static final GCMMultiplier mul = new Tables64kGCMMultiplier();
- private static final GCMExponentiator exp = new Tables1kGCMExponentiator();
- private static final byte[] EMPTY = new byte[0];
-
- static
- {
- H = new byte[16];
- random.nextBytes(H);
- mul.init(Arrays.clone(H));
- exp.init(Arrays.clone(H));
- }
-
- public void testCombine() throws Exception
- {
- for (int count = 0; count < 10; ++count)
- {
- byte[] A = randomBytes(1000);
- byte[] C = randomBytes(1000);
-
- byte[] ghashA_ = GHASH(A, EMPTY);
- byte[] ghash_C = GHASH(EMPTY, C);
- byte[] ghashAC = GHASH(A, C);
-
- byte[] ghashCombine = combine_GHASH(ghashA_, (long)A.length * 8, ghash_C, (long)C.length * 8);
-
- assertTrue(Arrays.areEqual(ghashAC, ghashCombine));
- }
- }
-
- public void testConcatAuth() throws Exception
- {
- for (int count = 0; count < 10; ++count)
- {
- byte[] P = randomBlocks(100);
- byte[] A = randomBytes(1000);
- byte[] PA = concatArrays(P, A);
-
- byte[] ghashP_ = GHASH(P, EMPTY);
- byte[] ghashA_ = GHASH(A, EMPTY);
- byte[] ghashPA_ = GHASH(PA, EMPTY);
- byte[] ghashConcat = concatAuth_GHASH(ghashP_, (long)P.length * 8, ghashA_, (long)A.length * 8);
-
- assertTrue(Arrays.areEqual(ghashPA_, ghashConcat));
- }
- }
-
- public void testConcatCrypt() throws Exception
- {
- for (int count = 0; count < 10; ++count)
- {
- byte[] P = randomBlocks(100);
- byte[] A = randomBytes(1000);
- byte[] PA = concatArrays(P, A);
-
- byte[] ghash_P = GHASH(EMPTY, P);
- byte[] ghash_A = GHASH(EMPTY, A);
- byte[] ghash_PA = GHASH(EMPTY, PA);
- byte[] ghashConcat = concatCrypt_GHASH(ghash_P, (long)P.length * 8, ghash_A, (long)A.length * 8);
-
- assertTrue(Arrays.areEqual(ghash_PA, ghashConcat));
- }
- }
-
- public void testExp()
- {
- {
- byte[] buf1 = new byte[16];
- buf1[0] = (byte)0x80;
-
- byte[] buf2 = new byte[16];
-
- for (int pow = 0; pow != 100; ++pow)
- {
- exp.exponentiateX(pow, buf2);
-
- assertTrue(Arrays.areEqual(buf1, buf2));
-
- mul.multiplyH(buf1);
- }
- }
-
- long[] testPow = new long[]{ 10, 1, 8, 17, 24, 13, 2, 13, 2, 3 };
- byte[][] testData = new byte[][]{
- Hex.decode("9185848a877bd87ba071e281f476e8e7"),
- Hex.decode("697ce3052137d80745d524474fb6b290"),
- Hex.decode("2696fc47198bb23b11296e4f88720a17"),
- Hex.decode("01f2f0ead011a4ae0cf3572f1b76dd8e"),
- Hex.decode("a53060694a044e4b7fa1e661c5a7bb6b"),
- Hex.decode("39c0392e8b6b0e04a7565c85394c2c4c"),
- Hex.decode("519c362d502e07f2d8b7597a359a5214"),
- Hex.decode("5a527a393675705e19b2117f67695af4"),
- Hex.decode("27fc0901d1d332a53ba4d4386c2109d2"),
- Hex.decode("93ca9b57174aabedf8220e83366d7df6"),
- };
-
- for (int i = 0; i != 10; ++i)
- {
- long pow = testPow[i];
- byte[] data = Arrays.clone(testData[i]);
-
- byte[] expected = Arrays.clone(data);
- for (int j = 0; j < pow; ++j)
- {
- mul.multiplyH(expected);
- }
-
- byte[] H_a = new byte[16];
- exp.exponentiateX(pow, H_a);
- byte[] actual = multiply(data, H_a);
-
- assertTrue(Arrays.areEqual(expected, actual));
- }
- }
-
- public void testMultiply()
- {
- byte[] expected = Arrays.clone(H);
- mul.multiplyH(expected);
-
- assertTrue(Arrays.areEqual(expected, multiply(H, H)));
-
- for (int count = 0; count < 10; ++count)
- {
- byte[] a = new byte[16];
- random.nextBytes(a);
-
- byte[] b = new byte[16];
- random.nextBytes(b);
-
- expected = Arrays.clone(a);
- mul.multiplyH(expected);
- assertTrue(Arrays.areEqual(expected, multiply(a, H)));
- assertTrue(Arrays.areEqual(expected, multiply(H, a)));
-
- expected = Arrays.clone(b);
- mul.multiplyH(expected);
- assertTrue(Arrays.areEqual(expected, multiply(b, H)));
- assertTrue(Arrays.areEqual(expected, multiply(H, b)));
-
- assertTrue(Arrays.areEqual(multiply(a, b), multiply(b, a)));
- }
- }
-
- private byte[] randomBlocks(int upper)
- {
- byte[] bs = new byte[16 * random.nextInt(upper)];
- random.nextBytes(bs);
- return bs;
- }
-
- private byte[] randomBytes(int upper)
- {
- byte[] bs = new byte[random.nextInt(upper)];
- random.nextBytes(bs);
- return bs;
- }
-
- private byte[] concatArrays(byte[] a, byte[] b) throws IOException
- {
- byte[] ab = new byte[a.length + b.length];
- System.arraycopy(a, 0, ab, 0, a.length);
- System.arraycopy(b, 0, ab, a.length, b.length);
- return ab;
- }
-
- private byte[] combine_GHASH(byte[] ghashA_, long bitlenA, byte[] ghash_C, long bitlenC)
- {
- // Note: bitlenA must be aligned to the block size
-
- long c = (bitlenC + 127) >>> 7;
-
- byte[] H_c = new byte[16];
- exp.exponentiateX(c, H_c);
-
- byte[] tmp1 = lengthBlock(bitlenA, 0);
- mul.multiplyH(tmp1);
-
- byte[] ghashAC = Arrays.clone(ghashA_);
- xor(ghashAC, tmp1);
- ghashAC = multiply(ghashAC, H_c);
- // No need to touch the len(C) part (second 8 bytes)
- xor(ghashAC, tmp1);
- xor(ghashAC, ghash_C);
-
- return ghashAC;
- }
-
- private byte[] concatAuth_GHASH(byte[] ghashP, long bitlenP, byte[] ghashA, long bitlenA)
- {
- // Note: bitlenP must be aligned to the block size
-
- long a = (bitlenA + 127) >>> 7;
-
- byte[] tmp1 = lengthBlock(bitlenP, 0);
- mul.multiplyH(tmp1);
-
- byte[] tmp2 = lengthBlock(bitlenA ^ (bitlenP + bitlenA), 0);
- mul.multiplyH(tmp2);
-
- byte[] H_a = new byte[16];
- exp.exponentiateX(a, H_a);
-
- byte[] ghashC = Arrays.clone(ghashP);
- xor(ghashC, tmp1);
- ghashC = multiply(ghashC, H_a);
- xor(ghashC, tmp2);
- xor(ghashC, ghashA);
- return ghashC;
- }
-
- private byte[] concatCrypt_GHASH(byte[] ghashP, long bitlenP, byte[] ghashA, long bitlenA)
- {
- // Note: bitlenP must be aligned to the block size
-
- long a = (bitlenA + 127) >>> 7;
-
- byte[] tmp1 = lengthBlock(0, bitlenP);
- mul.multiplyH(tmp1);
-
- byte[] tmp2 = lengthBlock(0, bitlenA ^ (bitlenP + bitlenA));
- mul.multiplyH(tmp2);
-
- byte[] H_a = new byte[16];
- exp.exponentiateX(a, H_a);
-
- byte[] ghashC = Arrays.clone(ghashP);
- xor(ghashC, tmp1);
- ghashC = multiply(ghashC, H_a);
- xor(ghashC, tmp2);
- xor(ghashC, ghashA);
- return ghashC;
- }
-
- private byte[] GHASH(byte[] A, byte[] C)
- {
- byte[] X = new byte[16];
-
- {
- for (int pos = 0; pos < A.length; pos += 16)
- {
- byte[] tmp = new byte[16];
- int num = Math.min(A.length - pos, 16);
- System.arraycopy(A, pos, tmp, 0, num);
- xor(X, tmp);
- mul.multiplyH(X);
- }
- }
-
- {
- for (int pos = 0; pos < C.length; pos += 16)
- {
- byte[] tmp = new byte[16];
- int num = Math.min(C.length - pos, 16);
- System.arraycopy(C, pos, tmp, 0, num);
- xor(X, tmp);
- mul.multiplyH(X);
- }
- }
-
- {
- xor(X, lengthBlock((long)A.length * 8, (long)C.length * 8));
- mul.multiplyH(X);
- }
-
- return X;
- }
-
- private static byte[] lengthBlock(long bitlenA, long bitlenC)
- {
- byte[] tmp = new byte[16];
- Pack.longToBigEndian(bitlenA, tmp, 0);
- Pack.longToBigEndian(bitlenC, tmp, 8);
- return tmp;
- }
-
- private static void xor(byte[] block, byte[] val)
- {
- for (int i = 15; i >= 0; --i)
- {
- block[i] ^= val[i];
- }
- }
-
- private static byte[] multiply(byte[] a, byte[] b)
- {
- byte[] c = new byte[16];
- byte[] tmp = Arrays.clone(b);
-
- for (int i = 0; i < 16; ++i)
- {
- byte bits = a[i];
- for (int j = 7; j >= 0; --j)
- {
- if ((bits & (1 << j)) != 0)
- {
- xor(c, tmp);
- }
-
- boolean lsb = (tmp[15] & 1) != 0;
- shiftRight(tmp);
- if (lsb)
- {
- // R = new byte[]{ 0xe1, ... };
-// GCMUtil.xor(v, R);
- tmp[0] ^= (byte)0xe1;
- }
- }
- }
-
- return c;
- }
-
- private static void shiftRight(byte[] block)
- {
- int i = 0;
- int bit = 0;
- for (;;)
- {
- int b = block[i] & 0xff;
- block[i] = (byte) ((b >>> 1) | bit);
- if (++i == 16)
- {
- break;
- }
- bit = (b & 1) << 7;
- }
- }
-}