diff --git a/crypto/test/src/pqc/crypto/test/CrystalsKyberTest.cs b/crypto/test/src/pqc/crypto/test/CrystalsKyberTest.cs
new file mode 100644
index 000000000..6130db774
--- /dev/null
+++ b/crypto/test/src/pqc/crypto/test/CrystalsKyberTest.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using NUnit.Framework;
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Pqc.Crypto.Crystals.Kyber;
+using Org.BouncyCastle.Utilities;
+using Org.BouncyCastle.Utilities.Encoders;
+using Org.BouncyCastle.Utilities.Test;
+
+namespace Org.BouncyCastle.Pqc.Crypto.Tests
+{
+ [TestFixture]
+ public class CrystalsKyberTest
+ {
+ [Test]
+ public void TestVectors()
+ {
+
+ KyberParameters[] KyberParams =
+ {
+ KyberParameters.kyber512,
+ KyberParameters.kyber768,
+ KyberParameters.kyber1024,
+ };
+ String[] files =
+ {
+ "kyber512.rsp",
+ "kyber768.rsp",
+ "kyber1024.rsp"
+ };
+
+ TestSampler sampler = new TestSampler();
+ for (int fileIndex = 0; fileIndex != files.Length; fileIndex++)
+ {
+ String name = files[fileIndex];
+ StreamReader src = new StreamReader(SimpleTest.GetTestDataAsStream("pqc.crystals.kyber." + name));
+
+
+ String line = null;
+ Dictionary<string, string> buf = new Dictionary<string, string>();
+ while ((line = src.ReadLine()) != null)
+ {
+ line = line.Trim();
+
+ if (line.StartsWith("#"))
+ {
+ continue;
+ }
+
+ if (line.Length == 0)
+ {
+ if (buf.Count > 0 && !sampler.SkipTest(buf["count"]))
+ {
+ String count = buf["count"];
+
+ byte[] seed = Hex.Decode(buf["seed"]); // seed for Kyber secure random
+ byte[] pk = Hex.Decode(buf["pk"]); // public key
+ byte[] sk = Hex.Decode(buf["sk"]); // private key
+ byte[] ct = Hex.Decode(buf["ct"]); // ciphertext
+ byte[] ss = Hex.Decode(buf["ss"]); // session key
+
+ NistSecureRandom random = new NistSecureRandom(seed, null);
+ KyberParameters parameters = KyberParams[fileIndex];
+
+ KyberKeyPairGenerator kpGen = new KyberKeyPairGenerator();
+ KyberKeyGenerationParameters
+ genParam = new KyberKeyGenerationParameters(random, parameters);
+
+ Console.WriteLine(string.Format("seed = {0}", Hex.ToHexString(seed)));
+
+ //
+ // Generate keys and test.
+ //
+ kpGen.Init(genParam);
+ AsymmetricCipherKeyPair kp = kpGen.GenerateKeyPair();
+
+
+ KyberPublicKeyParameters pubParams = (KyberPublicKeyParameters)kp.Public;
+ KyberPrivateKeyParameters privParams = (KyberPrivateKeyParameters)kp.Private;
+
+ //Console.WriteLine(string.Format("pk = {0}", Convert.ToHexString(pk)));
+ //Console.WriteLine(String.Format("Public key = {0}", Convert.ToHexString(pubParams.publicKey)));
+ Assert.True(Arrays.AreEqual(pk, pubParams.GetEncoded()), name + " " + count + ": public key");
+
+ Console.WriteLine(string.Format("sk = {0}", Hex.ToHexString(sk)));
+ Console.WriteLine(String.Format("sk bytes = {0}", sk.Length));
+ Console.WriteLine(String.Format("Secret key = {0}", Hex.ToHexString(privParams.GetEncoded())));
+ Console.WriteLine(String.Format("secret key bytes = {0}", privParams.GetEncoded().Length));
+
+ Assert.True(Arrays.AreEqual(sk, privParams.GetEncoded()), name + " " + count + ": secret key");
+
+ // KEM Enc
+ KyberKEMGenerator KyberEncCipher = new KyberKEMGenerator(random);
+ ISecretWithEncapsulation secWenc = KyberEncCipher.GenerateEncapsulated(pubParams);
+ byte[] generated_cipher_text = secWenc.GetEncapsulation();
+
+
+ //Console.WriteLine(string.Format("ct = {0}", Convert.ToHexString(ct)));
+ //Console.WriteLine(String.Format("ct bytes = {0}", ct.Length));
+ //Console.WriteLine(String.Format("Cipher Text = {0}", Convert.ToHexString(generated_cipher_text)));
+ //Console.WriteLine(String.Format("Cipher Text bytes = {0}", generated_cipher_text.Length));
+
+ //Console.WriteLine(string.Format("ss = {0}", Convert.ToHexString(ss)));
+ //Console.WriteLine(String.Format("ss bytes = {0}", ss.Length));
+ //Console.WriteLine(String.Format("Shared Secret = {0}", Convert.ToHexString(secWenc.GetSecret())));
+ //Console.WriteLine(String.Format("Shared Secret bytes = {0}", secWenc.GetSecret().Length));
+
+ Assert.True(Arrays.AreEqual(ct, generated_cipher_text), name + " " + count + ": kem_enc cipher text");
+ byte[] secret = secWenc.GetSecret();
+ Assert.True(Arrays.AreEqual(ss, 0, secret.Length, secret, 0, secret.Length), name + " " + count + ": kem_enc key");
+
+ // KEM Dec
+ KyberKEMExtractor KyberDecCipher = new KyberKEMExtractor(privParams);
+
+ byte[] dec_key = KyberDecCipher.ExtractSecret(generated_cipher_text);
+
+ Assert.AreEqual(dec_key.Length * 8, parameters.DefaultKeySize);
+ Assert.True(Arrays.AreEqual(dec_key, 0, dec_key.Length, ss, 0, dec_key.Length), name + " " + count + ": kem_dec ss");
+ Assert.True(Arrays.AreEqual(dec_key, secret), name + " " + count + ": kem_dec key");
+ }
+
+ buf.Clear();
+
+ continue;
+ }
+
+ int a = line.IndexOf("=");
+ if (a > -1)
+ {
+ buf[line.Substring(0, a).Trim()] = line.Substring(a + 1).Trim();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/crypto/test/src/pqc/crypto/test/NtruVectorTest.cs b/crypto/test/src/pqc/crypto/test/NtruVectorTest.cs
new file mode 100644
index 000000000..13f6ab800
--- /dev/null
+++ b/crypto/test/src/pqc/crypto/test/NtruVectorTest.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using NUnit.Framework;
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Pqc.Crypto.Ntru;
+using Org.BouncyCastle.Utilities;
+using Org.BouncyCastle.Utilities.Encoders;
+using Org.BouncyCastle.Utilities.Test;
+using NtruKeyPairGenerator = Org.BouncyCastle.Pqc.Crypto.Ntru.NtruKeyPairGenerator;
+
+namespace Org.BouncyCastle.Pqc.Crypto.Tests
+{
+ [TestFixture]
+ public class NtruVectorTest
+ {
+ [Test]
+ public void TestVectors()
+ {
+ string[] files =
+ {
+ "PQCkemKAT_935.rsp", // NtruHps2048509
+ "PQCkemKAT_1234.rsp", // NtruHps2048677
+ "PQCkemKAT_1590.rsp", // NtruHps4096821
+ "PQCkemKAT_1450.rsp" // NtruHrss701
+ };
+
+ NtruParameters[] parameters =
+ {
+ NtruParameters.NtruHps2048509,
+ NtruParameters.NtruHps2048677,
+ NtruParameters.NtruHps4096821,
+ NtruParameters.NtruHrss701
+ };
+
+ TestSampler sampler = new TestSampler();
+ for (int fileIndex = 0; fileIndex != files.Length; fileIndex++)
+ {
+ string name = files[fileIndex];
+ Console.Write("Testing " + name + "...");
+ Console.WriteLine("pqc.ntru." + name);
+ StreamReader src = new StreamReader(SimpleTest.GetTestDataAsStream("pqc.ntru." + name));
+ String line;
+ Dictionary<String, String> buf = new Dictionary<string, string>();
+
+ while ((line = src.ReadLine()) != null)
+ {
+ line = line.Trim();
+ if (line.StartsWith("#"))
+ {
+ continue;
+ }
+
+ if (line.Length == 0)
+ {
+ if (buf.Count > 0 && !sampler.SkipTest(buf["count"]))
+ {
+ String count = buf["count"];
+
+ if (!"0".Equals(count))
+ {
+ // Console.WriteLine("Zero");
+ }
+
+ byte[] seed = Hex.Decode(buf["seed"]);
+ byte[] pk = Hex.Decode(buf["pk"]);
+ byte[] ct = Hex.Decode(buf["ct"]);
+ byte[] sk = Hex.Decode(buf["sk"]);
+ byte[] ss = Hex.Decode(buf["ss"]);
+
+ NistSecureRandom random = new NistSecureRandom(seed, null);
+ NtruParameters ntruParameters = parameters[fileIndex];
+
+ // Test keygen
+ NtruKeyGenerationParameters keygenParameters =
+ new NtruKeyGenerationParameters(random, ntruParameters);
+
+ NtruKeyPairGenerator keygen = new NtruKeyPairGenerator();
+ keygen.Init(keygenParameters);
+ AsymmetricCipherKeyPair keyPair = keygen.GenerateKeyPair();
+
+ NtruPublicKeyParameters pubParams = (NtruPublicKeyParameters)keyPair.Public;
+ NtruPrivateKeyParameters privParams = (NtruPrivateKeyParameters)keyPair.Private;
+
+ Assert.True(Arrays.AreEqual(pk,pubParams.PublicKey), $"{name} {count} : public key");
+ Assert.True(Arrays.AreEqual(sk,privParams.PrivateKey), $"{name} {count} : private key");
+
+ // Test encapsulate
+ NtruKemGenerator encapsulator = new NtruKemGenerator(random);
+ ISecretWithEncapsulation encapsulation = encapsulator.GenerateEncapsulated(new NtruPublicKeyParameters(ntruParameters, pk));
+ byte[] generatedSecret = encapsulation.GetSecret();
+ byte[] generatedCiphertext = encapsulation.GetEncapsulation();
+
+ Assert.AreEqual(generatedSecret.Length, ntruParameters.DefaultKeySize / 8);
+ Assert.True(Arrays.AreEqual(ss, 0, generatedSecret.Length, generatedSecret, 0, generatedSecret.Length), $"{name} {count} : shared secret");
+ Assert.True(Arrays.AreEqual(ct, generatedCiphertext), $"{name} {count} : ciphertext");
+
+ // Test decapsulate
+ NtruKemExtractor decapsulator = new NtruKemExtractor(new NtruPrivateKeyParameters(ntruParameters, sk));
+ byte[] extractedSecret = decapsulator.ExtractSecret(ct);
+ Assert.AreEqual(generatedSecret.Length, extractedSecret.Length);
+ Assert.True(Arrays.AreEqual(ss, 0, extractedSecret.Length, extractedSecret, 0, extractedSecret.Length), $"{name} {count} : extract secret");
+
+ }
+ buf.Clear();
+ continue;
+ }
+ int a = line.IndexOf("=");
+ if (a > -1)
+ {
+ buf[line.Substring(0, a).Trim()] = line.Substring(a + 1).Trim();
+ }
+ }
+ Console.WriteLine("OK");
+ }
+ }
+ }
+}
|