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 'prov/src/test/java/org/spongycastle/jce/provider/test/Poly1305Test.java')
-rw-r--r--prov/src/test/java/org/spongycastle/jce/provider/test/Poly1305Test.java150
1 files changed, 150 insertions, 0 deletions
diff --git a/prov/src/test/java/org/spongycastle/jce/provider/test/Poly1305Test.java b/prov/src/test/java/org/spongycastle/jce/provider/test/Poly1305Test.java
new file mode 100644
index 00000000..ad3d0903
--- /dev/null
+++ b/prov/src/test/java/org/spongycastle/jce/provider/test/Poly1305Test.java
@@ -0,0 +1,150 @@
+package org.spongycastle.jce.provider.test;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.spongycastle.crypto.generators.Poly1305KeyGenerator;
+import org.spongycastle.jce.provider.BouncyCastleProvider;
+import org.spongycastle.util.Arrays;
+import org.spongycastle.util.encoders.Hex;
+import org.spongycastle.util.test.SimpleTest;
+import org.spongycastle.util.test.TestFailedException;
+
+public class Poly1305Test
+ extends SimpleTest
+{
+ private static final byte[] MASTER_KEY = Hex
+ .decode("95cc0e44d0b79a8856afcae1bec4fe3c01bcb20bfc8b6e03609ddd09f44b060f");
+
+ public String getName()
+ {
+ return "Poly1305";
+ }
+
+ public void performTest()
+ throws Exception
+ {
+ checkRegistrations();
+ }
+
+ private void checkRegistrations()
+ throws Exception
+ {
+ List missingMacs = new ArrayList();
+ List missingKeyGens = new ArrayList();
+
+ String[] ciphers = new String[]{"AES", "NOEKEON", "Twofish", "CAST6", "SEED", "Serpent", "RC6", "CAMELLIA"};
+ String[] macs = new String[]{
+ "4bb5e21dd13001ed5faccfcfdaf8a854",
+ "6d601be3d5ebbb9972a64ed3223d913d",
+ "211195296d9afc7b35a1223a79487c87",
+ "f328857a1b653684e73760c804c55b1d",
+ "21cd8adb23ca84eb4dbb12780595bf28",
+ "211195296d9afc7b35a1223a79487c87",
+ "db86de7b1fcae429753d68b1263d7ca0",
+ "11918174f33a2f278fb86554da094112"};
+
+ for (int i = 0; i < ciphers.length; i++)
+ {
+ String cipherName = ciphers[i];
+ Cipher cipher;
+ try
+ {
+ cipher = Cipher.getInstance(cipherName, "SC");
+ } catch (Exception e)
+ {
+ System.err.println(cipherName + ": " + e.getMessage());
+ continue;
+ }
+ int blocksize;
+ try
+ {
+ blocksize = cipher.getBlockSize();
+ } catch (Exception e)
+ {
+ System.err.println(cipherName + ": " + e.getMessage());
+ continue;
+ }
+ // Poly1305 is defined over 128 bit block ciphers
+ if (blocksize == 16)
+ {
+ String macName = "Poly1305-" + cipherName;
+ String macNameAlt = "Poly1305" + cipherName;
+
+ // Check we have a Poly1305 registered for each name
+ checkMac(macName, missingMacs, missingKeyGens, macs[i]);
+ checkMac(macNameAlt, missingMacs, missingKeyGens, macs[i]);
+ }
+ }
+ if (missingMacs.size() != 0)
+ {
+ fail("Did not find Poly1305 registrations for the following ciphers: " + missingMacs);
+ }
+ if (missingKeyGens.size() != 0)
+ {
+ fail("Did not find Poly1305 KeyGenerator registrations for the following macs: " + missingKeyGens);
+ }
+ }
+
+ private void checkMac(String name, List missingMacs, List missingKeyGens, String macOutput)
+ {
+ try
+ {
+ try
+ {
+ KeyGenerator kg = KeyGenerator.getInstance(name);
+ SecretKey key = kg.generateKey();
+
+ try
+ {
+ Poly1305KeyGenerator.checkKey(key.getEncoded());
+ } catch (IllegalArgumentException e)
+ {
+ fail("Generated key for algo " + name + " does not match required Poly1305 format.");
+ }
+
+ try
+ {
+ Mac mac = Mac.getInstance(name);
+ mac.init(new SecretKeySpec(MASTER_KEY, name), new IvParameterSpec(new byte[16]));
+ mac.update(new byte[128]);
+ byte[] bytes = mac.doFinal();
+
+ if (!Arrays.areEqual(bytes, Hex.decode(macOutput)))
+ {
+ fail("wrong mac value computed for " + name, macOutput, new String(Hex.encode(bytes)));
+ }
+ } catch (NoSuchAlgorithmException e)
+ {
+ missingMacs.add(name);
+ }
+
+ } catch (NoSuchAlgorithmException e)
+ {
+ missingKeyGens.add(name);
+ }
+ } catch (TestFailedException e)
+ {
+ throw e;
+ } catch (Exception e)
+ {
+ fail("Unexpected error", e);
+ }
+ }
+
+ public static void main(String[] args)
+ {
+ Security.addProvider(new BouncyCastleProvider());
+
+ runTest(new Poly1305Test());
+ }
+} \ No newline at end of file