public void RandomGeneratorShouldGenerateStringWithExactlySpecifiedLength()
        {
            var random = new RandomGenerator();

            for (int i = 0; i <= 50; i++)
            {
                string result = random.GenerateRandomString(i);

                Assert.AreEqual(result.Length, i);
            }
        }
        public void RandomGeneratorShouldGenerateNumbersInRangeInclusive()
        {
            var random = new RandomGenerator();

            for (int i = 0; i < 50; i++)
            {
                int number = random.GenerateRandomNumber(1, 3);

                Assert.IsTrue(number >= 1 && number <= 3);
            }
        }
        public void TestAes1000WithCertificate()
        {
            var cert2 = LoadCertificate();

            //var publicKey = X509CertificateHelper.GetRSACryptoServiceProviderFromPublicKey(cert2);
            var keyProtector = X509CertificateHelper.GetKeyEncryptionKey(cert2);

            // generate a protected key
            var gen = new ProtectedX509Certificate2Generator();

            var policy = new CertificatePolicy()
            {
                CommonName = "Testing protected certs",
                AllPurposes = true,
                ValidForDays = 2
            };

            var protectedKey = Task.Run(() => gen.IssueNewCertificateAsync(keyProtector, policy)).GetAwaiter().GetResult();

            // save the key to test
            var keyOutputFilePath = (CERT_FOLDER + "temp\\pk-" + protectedKey.KeyId + ".kpk");
            var fi = new FileInfo(keyOutputFilePath);
            if (!fi.Directory.Exists)
            {
                fi.Directory.Create();
            }
            var bytes = Task.Run(() => protectedKey.ToByteArrayAsync()).GetAwaiter().GetResult();
            File.WriteAllBytes(fi.FullName, bytes);
            Console.WriteLine(fi.FullName);
            var list = new List<string>();
            var listEnc = new List<AsymmetricallyEncryptedObject>();

            using (var privateKey = Task.Run(() => protectedKey.ToKeyEncyrptionKeyAsync(keyProtector)).GetAwaiter().GetResult())
            {
                //var publicKey = privateKey.PublicKey.Key as RSACryptoServiceProvider;

                //File.WriteAllText(fi.FullName + "_A.cer", privateKey.PublicKeyToPEM());
                
                int length = 100;
                var rand = new RandomGenerator();
                for (int i = 0; i < length; i++)
                {
                    var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";
                    list.Add(stringToEncrypt);
                    var asymEnc = new AsymmetricEncryptor(AsymmetricStrategyOption.Aes256_1000);
                    var asymObj = asymEnc.EncryptObjectAsync(stringToEncrypt, privateKey).GetAwaiter().GetResult();
                    listEnc.Add(asymObj);
                    var decrypted = asymEnc.DecryptObjectAsync(asymObj, privateKey).GetAwaiter().GetResult();
                    Assert.AreEqual(stringToEncrypt, decrypted);
                }
            }

            // lets reload a new private key

            var fileBytes = File.ReadAllBytes(fi.FullName);
            var encKey = new AsymmetricallyEncryptedObject();
            encKey.LoadFromByteArray(fileBytes);
            var protectedKey2 = new ProtectedX509Certificate2(protectedKey.KeyId, encKey);

            using (var privateKey = Task.Run(() => protectedKey2.ToKeyEncyrptionKeyAsync(keyProtector)).GetAwaiter().GetResult())
            {  

                var asymEnc = new AsymmetricEncryptor(AsymmetricStrategyOption.Aes256_1000);
                int i = 0;
                foreach (var line in list)
                {
                    var asymObj = listEnc[i];
                    var decrypted = asymEnc.DecryptObject(asymObj, privateKey);
                    Assert.AreEqual(line, decrypted);
                    i++;
                }
            }



        }
        public void TestAes1000WithCertificateAndSerialization()
        {
            var cert2 = LoadCertificate();

            var publicKey = new X509CertificatePublicKey(cert2);
            var privateKey = new X509Certificate2KeyEncryptionKey(cert2);

            int length = 100;
            var rand = new RandomGenerator();

            //for (int i = 0; i < length; i++)
            //{
            //    var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";
            //    var asymEnc = new AsymmetricEncryptor(AsymmetricStrategyOption.Aes256_1000);
            //    var asymObj = asymEnc.EncryptObject(stringToEncrypt, cert2.Thumbprint.ToString().ToLower(), publicKey);
            //    var decrypted = asymEnc.DecryptObject(asymObj, privateKey);
            //    Assert.AreEqual(stringToEncrypt, decrypted);
            //}

            var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";

            var encryptor = new AsymmetricEncryptor() { AsymmetricStrategy = AsymmetricStrategyOption.Aes256_1000 };
            var asymEncObj = encryptor.EncryptObjectAsync(stringToEncrypt, publicKey).GetAwaiter().GetResult();

            asymEncObj.PublicMetadata = new Dictionary<string, string>();
            asymEncObj.PublicMetadata["keyA"] = "valueA";
            asymEncObj.PublicMetadata["keyB"] = "valueB";

            asymEncObj.KeyId = cert2.Thumbprint.ToLower();
            var asymEncObjDirectSerializedBytes = Serializer.SerializeToByteArray(asymEncObj);

            // deserialize

            var asymEncObj2 = Serializer.DeserializeFromByteArray(asymEncObjDirectSerializedBytes) as AsymmetricallyEncryptedObject;
            Assert.IsNotNull(asymEncObj);
            Assert.IsTrue(!string.IsNullOrEmpty(asymEncObj.KeyId));

            var asymEncObjBytes2 = asymEncObj.ToByteArray();
            var asymEncObj3 = new AsymmetricallyEncryptedObject();
            asymEncObj3.LoadFromByteArray(asymEncObjBytes2);

            var decrypted = encryptor.DecryptObject(asymEncObj3, privateKey) as string;
            Assert.AreEqual(decrypted, stringToEncrypt);

            // test deserializing with direct
            var asymEncObj4 = new AsymmetricallyEncryptedObject();
            asymEncObj4.LoadFromByteArray(asymEncObjDirectSerializedBytes);

            var decrypted2 = encryptor.DecryptObject(asymEncObj4, privateKey) as string;
            Assert.AreEqual(decrypted2, stringToEncrypt);


        }
        public void TestAes5WithDualCertificate()
        {

            var cert2 = LoadCertificate();
            var publicKey = new X509CertificatePublicKey(cert2);
            var privateKey = new X509Certificate2KeyEncryptionKey(cert2);

            var cert2Dual = LoadCertificate2();
            var publicKey2 = new X509CertificatePublicKey(cert2Dual);
            var privateKey2 = new X509Certificate2KeyEncryptionKey(cert2Dual);

            int length = 100;
            var rand = new RandomGenerator();

            for (int i = 0; i < length; i++)
            {
                var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";
                var asymEnc = new AsymmetricEncryptor(AsymmetricStrategyOption.Aes256_5);
                var asymObj = asymEnc.EncryptObject(stringToEncrypt, publicKey, publicKey2);
                var decrypted = asymEnc.DecryptObject(asymObj, privateKey, privateKey2);
                Assert.AreEqual(stringToEncrypt, decrypted);
            }
        }
        public void TestAes5_Bytes()
        {
            int length = 100;
            var rand = new RandomGenerator();

            //byte[] entropy = new byte[20];


            for (int i = 0; i < length; i++)
            {

                byte[] newKey = new byte[rand.RandomNumber(75, 88)];
                using (var rng = new RNGCryptoServiceProvider())
                {
                    //rng.GetBytes(entropy);
                    rng.GetBytes(newKey);
                }

                var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";

                var bytes = System.Text.Encoding.UTF8.GetBytes(stringToEncrypt);

                // base 64
                var encryptedBytes = AesEncryptor.Encrypt5(bytes, newKey);
                var decryptedBytes = AesEncryptor.Decrypt(encryptedBytes, newKey);

                Assert.IsTrue(decryptedBytes.SequenceEqual(bytes));

                var decryptedString = System.Text.Encoding.UTF8.GetString(decryptedBytes);
                Assert.AreEqual(stringToEncrypt, decryptedString);


            }
        }
 public void TestAes200()
 {
     int length = 100;
     var rand = new RandomGenerator();
     for (int i = 0; i < length; i++)
     {
         using (var password = rand.RandomSecureStringPassword(10, 50))
         {
             var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";
             // base 64
             var encryptedBase64 = AesEncryptor.Encrypt200(stringToEncrypt, password);
             var decryptedBase64 = AesEncryptor.Decrypt(encryptedBase64, password);
             Assert.AreEqual(stringToEncrypt, decryptedBase64);
             // base 36
             var encryptedBase36 = AesEncryptor.Encrypt200(stringToEncrypt, password, true);
             var decryptedBase36 = AesEncryptor.Decrypt(encryptedBase36, password, true);
             Assert.AreEqual(stringToEncrypt, decryptedBase36);
         }
     }
 }
        public void TestAes20000_Bytes()
        {
            int length = 100;
            var rand = new RandomGenerator();

            //byte[] entropy = new byte[20];

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < length; i++)
            {

                byte[] newKey = new byte[rand.RandomNumber(75, 88)];
                using (var rng = new RNGCryptoServiceProvider())
                {
                    //rng.GetBytes(entropy);
                    rng.GetBytes(newKey);
                }

                var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";

                var bytes = System.Text.Encoding.UTF8.GetBytes(stringToEncrypt);

                // base 64
                var encryptedBytes = AesEncryptor.Encrypt20000(bytes, newKey);
                var decryptedBytes = AesEncryptor.Decrypt(encryptedBytes, newKey);

                Assert.IsTrue(decryptedBytes.SequenceEqual(bytes));

                var decryptedString = System.Text.Encoding.UTF8.GetString(decryptedBytes);
                Assert.AreEqual(stringToEncrypt, decryptedString);

                Console.WriteLine(string.Format("{0:N0}\t{1}", i, stopwatch.Elapsed));
                stopwatch.Stop();
                stopwatch.Reset();
                stopwatch.Start();
            }
        }
        public void TestAes20000()
        {
            int length = 100;
            var rand = new RandomGenerator();
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = 0; i < length; i++)
            {
                using (var password = rand.RandomSecureStringPassword(10, 50))
                {
                    var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";
                    // base 64
                    var encryptedBase64 = AesEncryptor.Encrypt20000(stringToEncrypt, password);
                    var decryptedBase64 = AesEncryptor.Decrypt(encryptedBase64, password);
                    Assert.AreEqual(stringToEncrypt, decryptedBase64);
                    // base 36
                    var encryptedBase36 = AesEncryptor.Encrypt20000(stringToEncrypt, password, true);
                    var decryptedBase36 = AesEncryptor.Decrypt(encryptedBase36, password, true);
                    Assert.AreEqual(stringToEncrypt, decryptedBase36);

                    Console.WriteLine(string.Format("{0:N0}\t{1}", i, stopwatch.Elapsed));
                    stopwatch.Stop();
                    stopwatch.Reset();
                    stopwatch.Start();
                }
            }
        }
        public void TestProtectPasswordDualKey()
        {
            var cert2 = LoadCertificate();
            var publicKey = new X509CertificatePublicKey(cert2);
            var privateKey = new X509Certificate2KeyEncryptionKey(cert2);

            var cert2Dual = LoadCertificate2();
            var publicKey2 = new X509CertificatePublicKey(cert2Dual);
            var privateKey2 = new X509Certificate2KeyEncryptionKey(cert2Dual);

            int length = 100;
            var rand = new RandomGenerator();
            for (int i = 0; i < length; i++)
            {
                using (var password = rand.RandomSecureStringPassword(10, 50))
                {
                    var stringToEncrypt = Guid.NewGuid().ToString("N") + ":* d’une secrétairE chargée des affaires des étudiants de la section";

                    // base 64
                    var encryptedBase64 = AesEncryptor.Encrypt1000(stringToEncrypt, password);
                    var decryptedBase64 = AesEncryptor.Decrypt(encryptedBase64, password);
                    Assert.AreEqual(stringToEncrypt, decryptedBase64);

                    // base 36
                    var encryptedBase36 = AesEncryptor.Encrypt1000(stringToEncrypt, password, true);
                    var decryptedBase36 = AesEncryptor.Decrypt(encryptedBase36, password, true);
                    Assert.AreEqual(stringToEncrypt, decryptedBase36);

                    var protectedPwStr = AsymmetricEncryptor.EncryptToBase64StringAsync(password, publicKey, publicKey2).GetAwaiter().GetResult();

                    var unprotectedPwdStr = AsymmetricEncryptor.DecryptFromBase64String(protectedPwStr, privateKey, privateKey2);

                    var decryptedUnprotectedPw = AesEncryptor.Decrypt(encryptedBase64, unprotectedPwdStr);
                    Assert.AreEqual(stringToEncrypt, decryptedUnprotectedPw);

                }
            }
        }