public void Before_each_test() { //ServicesRepository servicesRepository = new ServicesRepository(new ScutexEntities()); //CommonRepository commonRepository = new CommonRepository(new ScutexServiceEntities()); AsymmetricEncryptionProvider asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); SymmetricEncryptionProvider symmetricEncryptionProvider = new SymmetricEncryptionProvider(); ObjectSerializationProvider objectSerializationProvider = new ObjectSerializationProvider(); NumberDataGenerator numberDataGenerator = new NumberDataGenerator(); PackingService packingService = new PackingService(numberDataGenerator); MasterService masterService = new MasterService(commonRepository); CommonService commonService = new CommonService(); KeyPairService keyPairService = new KeyPairService(commonService, commonRepository); ServiceStatusProvider serviceStatusProvider = new ServiceStatusProvider(symmetricEncryptionProvider, objectSerializationProvider, asymmetricEncryptionProvider); servicesService = new ServicesService(servicesRepository, serviceStatusProvider, packingService, null, null, null, null, null, null); controlService = new ControlService(symmetricEncryptionProvider, keyPairService, packingService, masterService, objectSerializationProvider, asymmetricEncryptionProvider); service = new Scutex.Model.Service(); service.OutboundKeyPair = asymmetricEncryptionProvider.GenerateKeyPair(BitStrengths.High); service.InboundKeyPair = asymmetricEncryptionProvider.GenerateKeyPair(BitStrengths.High); service.ManagementInboundKeyPair = asymmetricEncryptionProvider.GenerateKeyPair(BitStrengths.High); service.ManagementOutboundKeyPair = asymmetricEncryptionProvider.GenerateKeyPair(BitStrengths.High); }
public void EncryptDecryptBlob_WithPrivateKey() { using (var options = new SymmetricEncryptionProviderOptions()) using (var engine = new SymmetricEncryptionProvider(options)) { byte[] privateKey = null; using (var rng = new RandomNumberGenerator()) { privateKey = rng.NextBytes(20); } ReadOnlySpan <byte> text = Utf8.NoBom.GetBytes("My name Jeff"); var encryptedBlob = engine.Encrypt(text, privateKey); assert.True(!encryptedBlob.IsEmpty); assert.True(encryptedBlob != text); var data = new byte[encryptedBlob.Length]; encryptedBlob.CopyTo(data); var text2 = engine.Decrypt(encryptedBlob, privateKey); assert.True(!text2.IsEmpty); assert.Equal(text.Length, text2.Length); for (var i = 0; i < text2.Length; i++) { assert.Equal(text[i], text2[i]); } } }
public static void HashTokenWithSalt() { HashingProvider provider = new HashingProvider(); Console.WriteLine(provider.ComputeHashWithSalt("b$7SDt%43J*a!9", "SHA256", null)); PackingService service = new PackingService(new NumberDataGenerator()); Token t = new Token(); t.Data = "MXLBEcLe6/i1CjdyomC7T0vTlACTXpdRmnxcDXDE8yDuCal0xA=="; t.Timestamp = DateTime.Now; Console.WriteLine(service.PackToken(t)); SymmetricEncryptionProvider encryption = new SymmetricEncryptionProvider(); EncryptionInfo ei = new EncryptionInfo(); ei.HashAlgorithm = "SHA1"; ei.InitVector = "a01JQ3481Ahnqwe9"; ei.Iterations = 2; ei.KeySize = 256; ei.PassPhrase = "Da*eW6_EzU4_swuk8*hU"; ei.SaltValue = "VuW9uDrE"; Console.WriteLine(encryption.Encrypt("861641072009MXLBEcLe6/i1CjdyomC7T0vTlACTXpdRmnxcDXDE8yDuCal0xA==41410860", ei)); Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.ReadLine(); }
public void Before_each_test() { clientLicenseRepoistory = new ClientLicenseRepository(objectSerializationProvider, symmetricEncryptionProvider); clientLicenseService = new ClientLicenseService(clientLicenseRepoistory); serviceProductsRepository = new ServiceProductsRepository(new ScutexServiceEntities()); symmetricEncryptionProvider = new SymmetricEncryptionProvider(); asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); hashingProvider = new HashingProvider(); objectSerializationProvider = new ObjectSerializationProvider(); numberDataGenerator = new NumberDataGenerator(); packingService = new PackingService(numberDataGenerator); commonRepository = new CommonRepository(new ScutexServiceEntities()); clientRepository = new ClientRepository(new ScutexServiceEntities()); keyGenerator = new KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); masterService = new MasterService(commonRepository); activationLogRepository = new ActivationLogRepoistory(new ScutexServiceEntities()); activationLogService = new ActivationLogService(activationLogRepository, hashingProvider); keyService = new KeyManagementService(clientRepository, licenseKeyService, activationLogService, hashingProvider, serviceProductsRepository); commonService = new CommonService(); string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase); path = path.Replace("file:\\", ""); var mockCommonService = new Mock<ICommonService>(); mockCommonService.Setup(common => common.GetPath()).Returns(path + "\\Data\\Client\\"); string masterServiceDataText; using (TextReader reader = new StreamReader(path + "\\Data\\MasterService.dat")) { masterServiceDataText = reader.ReadToEnd().Trim(); } masterServiceData = objectSerializationProvider.Deserialize<MasterServiceData>(masterServiceDataText); var mockCommonRepository = new Mock<ICommonRepository>(); mockCommonRepository.Setup(repo => repo.GetMasterServiceData()).Returns(masterServiceData); keyPairService = new KeyPairService(mockCommonService.Object, mockCommonRepository.Object); controlService = new ControlService(symmetricEncryptionProvider, keyPairService, packingService, masterService, objectSerializationProvider, asymmetricEncryptionProvider); servicesRepository = new ServicesRepository(new ScutexEntities()); serviceStatusProvider = new ServiceStatusProvider(symmetricEncryptionProvider, objectSerializationProvider, asymmetricEncryptionProvider); licenseActiviationProvider = new LicenseActiviationProvider(asymmetricEncryptionProvider, symmetricEncryptionProvider, objectSerializationProvider); servicesService = new ServicesService(servicesRepository, serviceStatusProvider, packingService, licenseActiviationProvider, null, null, null, null, null); licenseKeyService = new LicenseKeyService(keyGenerator, packingService, clientLicenseService); activationService = new ActivationService(controlService, keyService, keyPairService, objectSerializationProvider, asymmetricEncryptionProvider, null, null); string serviceData; using (TextReader reader = new StreamReader(path + "\\Data\\Service.dat")) { serviceData = reader.ReadToEnd().Trim(); } service = objectSerializationProvider.Deserialize<Service>(serviceData); }
public static void BatchSmallLicenseKeyGenrationTest() { IAsymmetricEncryptionProvider asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); ISymmetricEncryptionProvider symmetricEncryptionProvider = new SymmetricEncryptionProvider(); IHashingProvider hashingProvider = new HashingProvider(); IObjectSerializationProvider objectSerializationProvider = new ObjectSerializationProvider(); ILicenseActiviationProvider licenseActiviationProvider = new LicenseActiviationProvider( asymmetricEncryptionProvider, symmetricEncryptionProvider, objectSerializationProvider); INumberDataGeneratorProvider numberDataGeneratorProvider = new NumberDataGenerator(); IPackingService packingService = new PackingService(numberDataGeneratorProvider); IHardwareFingerprintService hardwareFingerprintService = new HardwareFingerprintService(new WmiDataProvider(), hashingProvider); IClientLicenseRepository clientLicenseRepository = new ClientLicenseRepository(objectSerializationProvider, symmetricEncryptionProvider); IClientLicenseService clientLicenseService = new ClientLicenseService(clientLicenseRepository); ISmallKeyGenerator smallKeyGenerator = new WaveTech.Scutex.Generators.StaticKeyGeneratorSmall.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); ILargeKeyGenerator staticKeyGeneratorLarge = new WaveTech.Scutex.Generators.StaticKeyGeneratorLarge.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider, hardwareFingerprintService); LicenseKeyService licenseKeyService = new LicenseKeyService(smallKeyGenerator, staticKeyGeneratorLarge, packingService, clientLicenseService); ClientLicense license = new ClientLicense(); LicenseGenerationOptions generationOptions = new LicenseGenerationOptions(); license.UniqueId = Guid.NewGuid(); license.Product = new Product(); license.Product.Name = "My Great Uber Cool Product, with new juice!"; license.Product.ProductId = 1; string productHash = hashingProvider.Checksum32(license.GetLicenseProductIdentifier()).ToString("X"); DateTime start = DateTime.Now; List <string> licenseKeys = licenseKeyService.GenerateLicenseKeys("TEST", license, generationOptions, 100000); Dictionary <string, string> doubleCheck = new Dictionary <string, string>(); DateTime end = DateTime.Now; foreach (string s in licenseKeys) { doubleCheck.Add(s, ""); Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine("================================="); Console.WriteLine(string.Format("Key Generation took {0}", end - start)); Console.WriteLine(string.Format("Generated {0} unique license keys", licenseKeys.Count)); Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.ReadLine(); }
public void TestMethod1() { var crypto = SymmetricEncryptionProvider <Aes> .Create(); var enumTestValue = DataProviders.SqlServer; var enumTestDesc = enumTestValue.GetDescription(); var test = crypto.ExpectedKeySize; var test2 = CryptographicDigest.Create().GetDigestFromEmbedded(crypto.ExpectedKeySize); var test3 = CryptographicDigest.Create().GetDigestFromEmbedded( Assembly.GetExecutingAssembly().Location, "ApplicationFrameworkSDKTest.crypto2.jpg", crypto.ExpectedKeySize); }
public static void SmallLicenseKeyWithLessThen15CharsTest() { IAsymmetricEncryptionProvider asymmetricEncryptionProvider; ISymmetricEncryptionProvider symmetricEncryptionProvider; IHashingProvider hashingProvider; WaveTech.Scutex.Generators.StaticKeyGeneratorSmall.KeyGenerator smallKeyGenerator; ClientLicense license; LicenseGenerationOptions generationOptions; //List<LicensePlaceholder> placeholders; //Dictionary<int, LicensePlaceholder> placeholdersInTemplate; for (int i = 0; i < 100000; i++) { asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); symmetricEncryptionProvider = new SymmetricEncryptionProvider(); hashingProvider = new HashingProvider(); smallKeyGenerator = new WaveTech.Scutex.Generators.StaticKeyGeneratorSmall.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); license = new ClientLicense(); generationOptions = new LicenseGenerationOptions(); license.UniqueId = Guid.NewGuid(); license.Product = new Product(); license.Product.Name = "My Great Uber Cool Product, with new juice!"; license.Product.ProductId = 1; license.LicenseSets = new NotifyList <LicenseSet>(); license.LicenseSets.Add(new LicenseSet()); license.LicenseSets.First().SupportedLicenseTypes = LicenseKeyTypeFlag.SingleUser; license.LicenseSets.First().SupportedLicenseTypes |= LicenseKeyTypeFlag.Enterprise; license.LicenseSets.First().SupportedLicenseTypes |= LicenseKeyTypeFlag.Unlimited; generationOptions.LicenseKeyType = LicenseKeyTypes.Enterprise; string key = smallKeyGenerator.GenerateLicenseKey("TEST", license, generationOptions); if (key.Length < 15) { string error = key; Console.WriteLine("ERROR: " + error); } Console.WriteLine(key); } }
public static void LicenseKeyGenerationTest() { IAsymmetricEncryptionProvider asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); ISymmetricEncryptionProvider symmetricEncryptionProvider = new SymmetricEncryptionProvider(); IHashingProvider hashingProvider = new HashingProvider(); IObjectSerializationProvider objectSerializationProvider = new ObjectSerializationProvider(); ILicenseActiviationProvider licenseActiviationProvider = new LicenseActiviationProvider( asymmetricEncryptionProvider, symmetricEncryptionProvider, objectSerializationProvider); INumberDataGeneratorProvider numberDataGeneratorProvider = new NumberDataGenerator(); IPackingService packingService = new PackingService(numberDataGeneratorProvider); IHardwareFingerprintService hardwareFingerprintService = new HardwareFingerprintService(new WmiDataProvider(), hashingProvider); IClientLicenseRepository clientLicenseRepository = new ClientLicenseRepository(objectSerializationProvider, symmetricEncryptionProvider); IClientLicenseService clientLicenseService = new ClientLicenseService(clientLicenseRepository); KeyGenerator staticKeyGenerator = new KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); ILargeKeyGenerator staticKeyGeneratorLarge = new WaveTech.Scutex.Generators.StaticKeyGeneratorLarge.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider, hardwareFingerprintService); LicenseKeyService licenseKeyService = new LicenseKeyService(staticKeyGenerator, staticKeyGeneratorLarge, packingService, clientLicenseService); ClientLicense license = new ClientLicense(); LicenseGenerationOptions generationOptions = new LicenseGenerationOptions(); license.UniqueId = Guid.NewGuid(); license.Product = new Product(); license.Product.Name = "My Great Uber Cool Product, with new juice!"; license.Product.ProductId = 1; string productHash = hashingProvider.Checksum32(license.GetLicenseProductIdentifier()).ToString("X"); Dictionary <string, string> licenseKeys = new Dictionary <string, string>(); DateTime start = DateTime.Now; for (int i = 0; i < 100000; i++) { string key = licenseKeyService.GenerateLicenseKey("TEST", license, generationOptions); licenseKeys.Add(key, key.GetHashCode().ToString()); Console.WriteLine(key); } DateTime end = DateTime.Now; Console.WriteLine(start - end); }
public void DecryptStringTest() { EncryptionInfo info = new EncryptionInfo(); info.PassPhrase = "Pas5pr@se"; // can be any string info.SaltValue = "s@1tValue"; // can be any string info.HashAlgorithm = "SHA1"; // can be "MD5" info.Iterations = 2; // can be any number info.InitVector = "@1B2c3D4e5F6g7H8"; // must be 16 bytes info.KeySize = 256; // can be 192 or 128 SymmetricEncryptionProvider provider = new SymmetricEncryptionProvider(); string plainText2 = provider.Decrypt(cipherText, info); Assert.IsNotNull(plainText2); Assert.AreEqual(plainText2, plainText); }
public void TestLicenseKeyHashing() { IAsymmetricEncryptionProvider asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); ISymmetricEncryptionProvider symmetricEncryptionProvider = new SymmetricEncryptionProvider(); IHashingProvider hashingProvider = new HashingProvider(); IObjectSerializationProvider objectSerializationProvider = new ObjectSerializationProvider(); ILicenseActiviationProvider licenseActiviationProvider = new LicenseActiviationProvider( asymmetricEncryptionProvider, symmetricEncryptionProvider, objectSerializationProvider); INumberDataGeneratorProvider numberDataGeneratorProvider = new NumberDataGenerator(); IHardwareFingerprintService hardwareFingerprintService = new HardwareFingerprintService(new WmiDataProvider(), new HashingProvider()); IPackingService packingService = new PackingService(numberDataGeneratorProvider); IClientLicenseRepository clientLicenseRepository = new ClientLicenseRepository(objectSerializationProvider, symmetricEncryptionProvider); IClientLicenseService clientLicenseService = new ClientLicenseService(clientLicenseRepository); ILargeKeyGenerator largeKeyGenerator = new KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider, hardwareFingerprintService); ISmallKeyGenerator smallKeyGenerator = new WaveTech.Scutex.Generators.StaticKeyGeneratorSmall.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); LicenseKeyService licenseKeyService = new LicenseKeyService(smallKeyGenerator, largeKeyGenerator, packingService, clientLicenseService); ClientLicense license = new ClientLicense(); LicenseGenerationOptions generationOptions = new LicenseGenerationOptions(); license.UniqueId = Guid.NewGuid(); license.Product = new Product(); license.Product.Name = "My Great Uber Cool Product, with new juice!"; license.Product.ProductId = 1; string productHash = hashingProvider.Checksum32(license.GetLicenseProductIdentifier()).ToString("X"); Dictionary <string, string> licenseKeys = new Dictionary <string, string>(); List <string> keys = licenseKeyService.GenerateLicenseKeys("TEST", license, generationOptions, 100000); foreach (string key in keys) { string hash = hashingProvider.ComputeHash(key, "SHA256"); licenseKeys.Add(hash, key); Console.WriteLine(key + "\t" + hash); Assert.IsTrue(hash.Equals(hashingProvider.ComputeHash(key, "SHA256"))); Assert.IsFalse(hash.Contains("'")); } }
public LicenseHelper() { asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); hashingProvider = new HashingProvider(); encodingService = new EncodingService(); objectSerializationProvider = new ObjectSerializationProvider(); symmetricEncryptionProvider = new SymmetricEncryptionProvider(); clientLicenseRepository = new ClientLicenseRepository(objectSerializationProvider, symmetricEncryptionProvider); clientLicenseService = new ClientLicenseService(clientLicenseRepository); serviceStatusProvider = new ServiceStatusProvider(symmetricEncryptionProvider, objectSerializationProvider, asymmetricEncryptionProvider); numberDataGenerator = new NumberDataGenerator(); packingService = new PackingService(numberDataGenerator); hardwareFingerprintService = new HardwareFingerprintService(new WmiDataProvider(), new HashingProvider()); keygen = new KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); keyGeneratorLarge = new Scutex.Generators.StaticKeyGeneratorLarge.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider, hardwareFingerprintService); licenseActiviationProvider = new LicenseActiviationProvider(asymmetricEncryptionProvider, symmetricEncryptionProvider, objectSerializationProvider); service = new LicenseKeyService(keygen, keyGeneratorLarge, packingService, clientLicenseService); productsProvider = new ProductsProvider(symmetricEncryptionProvider, objectSerializationProvider, asymmetricEncryptionProvider); zipCompressionProvider = new ZipCompressionProvider(); wcfPackagingService = new WcfPackagingService(zipCompressionProvider); //licenseSetsRepository = new LicenseSetsRepository(); //licenseSetService = new LicenseSetService(); //licenseService = new LicenseService(); License = new License(); License.Name = "UnitTest License"; License.UniqueId = Guid.NewGuid(); License.KeyPair = asymmetricEncryptionProvider.GenerateKeyPair(BitStrengths.High); //string path = System.Reflection.Assembly.GetAssembly(typeof(LicenseHelper)).Location; string path = Helper.AssemblyDirectory; DllHash = encodingService.Encode(hashingProvider.HashFile(path + "\\WaveTech.Scutex.Licensing.dll")); PublicKey = encodingService.Encode(License.KeyPair.PublicKey); }
public void Before_each_test() { clientLicenseRepoistory = new ClientLicenseRepository(objectSerializationProvider, symmetricEncryptionProvider); clientLicenseService = new ClientLicenseService(clientLicenseRepoistory); serviceProductsRepository = new ServiceProductsRepository(new ScutexServiceEntities()); symmetricEncryptionProvider = new SymmetricEncryptionProvider(); asymmetricEncryptionProvider = new AsymmetricEncryptionProvider(); hashingProvider = new HashingProvider(); objectSerializationProvider = new ObjectSerializationProvider(); numberDataGenerator = new NumberDataGenerator(); packingService = new PackingService(numberDataGenerator); commonRepository = new CommonRepository(new ScutexServiceEntities()); clientRepository = new ClientRepository(new ScutexServiceEntities()); keyGenerator = new KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider); masterService = new MasterService(commonRepository); hardwareFingerprintService = new HardwareFingerprintService(new WmiDataProvider(), new HashingProvider()); keyGeneratorLarge = new Scutex.Generators.StaticKeyGeneratorLarge.KeyGenerator(symmetricEncryptionProvider, asymmetricEncryptionProvider, hashingProvider, hardwareFingerprintService); var mockActivationLogRepository = new Mock <IActivationLogRepoistory>(); mockActivationLogRepository.Setup(log => log.SaveActivationLog(It.IsAny <Scutex.Model.ActivationLog>())); activationLogService = new ActivationLogService(mockActivationLogRepository.Object, hashingProvider); commonService = new CommonService(); string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase); path = path.Replace("file:\\", ""); var mockCommonService = new Mock <ICommonService>(); mockCommonService.Setup(common => common.GetPath()).Returns(path + "\\Data\\Client\\"); string masterServiceDataText; using (TextReader reader = new StreamReader(path + "\\Data\\MasterService.dat")) { masterServiceDataText = reader.ReadToEnd().Trim(); } masterServiceData = objectSerializationProvider.Deserialize <MasterServiceData>(masterServiceDataText); var mockCommonRepository = new Mock <ICommonRepository>(); mockCommonRepository.Setup(repo => repo.GetMasterServiceData()).Returns(masterServiceData); masterService = new MasterService(mockCommonRepository.Object); keyPairService = new KeyPairService(mockCommonService.Object, mockCommonRepository.Object); controlService = new ControlService(symmetricEncryptionProvider, keyPairService, packingService, masterService, objectSerializationProvider, asymmetricEncryptionProvider); servicesRepository = new ServicesRepository(new ScutexEntities()); serviceStatusProvider = new ServiceStatusProvider(symmetricEncryptionProvider, objectSerializationProvider, asymmetricEncryptionProvider); licenseActiviationProvider = new LicenseActiviationProvider(asymmetricEncryptionProvider, symmetricEncryptionProvider, objectSerializationProvider); servicesService = new ServicesService(servicesRepository, serviceStatusProvider, packingService, licenseActiviationProvider, null, null, null, null, null); licenseKeyService = new LicenseKeyService(keyGenerator, keyGeneratorLarge, packingService, clientLicenseService); keyService = new KeyManagementService(clientRepository, licenseKeyService, activationLogService, hashingProvider, serviceProductsRepository); activationService = new ActivationService(controlService, keyService, keyPairService, objectSerializationProvider, asymmetricEncryptionProvider, activationLogService, masterService, commonService, null); string serviceData; using (TextReader reader = new StreamReader(path + "\\Data\\Service.dat")) { serviceData = reader.ReadToEnd().Trim(); } service = objectSerializationProvider.Deserialize <Service>(serviceData); }
public void ReaderHeader_WithPrivateKey() { using (var options = new SymmetricEncryptionProviderOptions()) using (var engine = new SymmetricEncryptionProvider()) { byte[] privateKey = null; using (var rng = new RandomNumberGenerator()) { privateKey = rng.NextBytes(20); } byte[] data = null; var header1 = engine.GenerateHeader(options, privateKey: privateKey); data = new byte[header1.Bytes.Memory.Length]; header1.Bytes.Memory.CopyTo(data); var ms = new MemoryStream(data); using (var header = engine.ReadHeader(ms, options, privateKey)) { ms.Position = 0; var data2 = new byte[header.Bytes.Memory.Length]; header.Bytes.Memory.CopyTo(data2); assert.Equal(data.Length, data2.Length); assert.Equal(data, data2); assert.NotNull(header); assert.Equal(1, header.Version); assert.Equal(SymmetricAlgorithmType.AES, header.SymmetricAlgorithmType); assert.Equal(KeyedHashAlgorithmType.HMACSHA256, header.KeyedHashAlgorithmType); assert.Equal(0, header.MetaDataSize); assert.NotEqual(0, header.SigningSaltSize); assert.NotEqual(0, header.SymmetricSaltSize); assert.NotEqual(0, header.IvSize); assert.NotEqual(0, header.HashSize); assert.NotEqual(0, header.Iterations); assert.NotNull(header.SymmetricKey); assert.NotNull(header.IV); assert.NotNull(header.SigningKey); assert.NotNull(header.Bytes); assert.Ok(!header.SymmetricKey.Memory.IsEmpty); assert.Ok(!header.IV.Memory.IsEmpty); assert.Ok(!header.SigningKey.Memory.IsEmpty); var temp = new byte[header.SymmetricKey.Memory.Length]; header.SymmetricKey.Memory.CopyTo(temp); assert.NotEqual(privateKey, temp); assert.Ok(!header.Bytes.Memory.IsEmpty); ms.Position = 0; using (var br = new BinaryReader(ms)) { assert.Equal(1, br.ReadInt16()); assert.Equal((short)SymmetricAlgorithmType.AES, br.ReadInt16()); assert.Equal((short)KeyedHashAlgorithmType.HMACSHA256, br.ReadInt16()); assert.Equal(header.MetaDataSize, br.ReadInt32()); assert.Equal(header.Iterations, br.ReadInt32()); assert.Equal(header.SymmetricSaltSize, br.ReadInt16()); assert.Equal(header.SigningSaltSize, br.ReadInt16()); assert.Equal(header.IvSize, br.ReadInt16()); assert.Equal(header.SymmetricKeySize, br.ReadInt16()); assert.Equal(header.HashSize, br.ReadInt16()); assert.Equal(header.Version, header1.Version); assert.Equal(header.KeyedHashAlgorithmType, header1.KeyedHashAlgorithmType); assert.Equal(header.SymmetricAlgorithmType, header1.SymmetricAlgorithmType); assert.Equal(header.MetaDataSize, header1.MetaDataSize); assert.Equal(header.Iterations, header1.Iterations); assert.Equal(header.SymmetricSaltSize, header1.SymmetricSaltSize); assert.Equal(header.SigningSaltSize, header1.SigningSaltSize); assert.Equal(header.IvSize, header1.IvSize); assert.Equal(header.SymmetricKeySize, header1.SymmetricKeySize); assert.Equal(header.HashSize, header1.HashSize); byte[] metadata = null; byte[] symmetricSalt = null; byte[] signingSalt = null; byte[] iv = null; byte[] symmetricKey = null; byte[] hash = null; // header values // 1. version // 2. metadataSize // 3. iterations // 4. symmetricSaltSize // 5. signingSaltSize // 6. ivSize // 7. symmetricKeySize // 8. hashSize // header values // 1. metadata (optional) // 2. symmetricSalt (optional) // 3. signingSalt (optional) // 4. iv // 5. symmetricKey (optional) // 6. hash if (header.MetaDataSize > 0) { metadata = br.ReadBytes(header.MetaDataSize); } if (header.SymmetricSaltSize > 0) { assert.Equal(options.SaltSize / 8, header.SymmetricSaltSize); var name = System.Security.Cryptography.HashAlgorithmName.SHA256; symmetricSalt = br.ReadBytes(header.SymmetricSaltSize); using (var generator = new Rfc2898DeriveBytes(privateKey, symmetricSalt, options.Iterations, name)) { symmetricKey = generator.GetBytes(options.KeySize / 8); var p1 = new byte[header.SymmetricKey.Memory.Length]; var p2 = new byte[header1.SymmetricKey.Memory.Length]; header.SymmetricKey.Memory.CopyTo(p1); header1.SymmetricKey.Memory.CopyTo(p2); assert.Equal(p1, p2); assert.Equal(symmetricKey, p1); } symmetricKey = null; } if (header.SigningSaltSize > 0) { signingSalt = br.ReadBytes(header.SigningSaltSize); var name = System.Security.Cryptography.HashAlgorithmName.SHA256; using (var generator = new Rfc2898DeriveBytes(privateKey, signingSalt, options.Iterations, name)) { var signingKey = generator.GetBytes(options.KeySize / 8); var p1 = new byte[header.SymmetricKey.Memory.Length]; header.SigningKey.Memory.CopyTo(p1); assert.Equal(signingKey, p1); } } if (header.IvSize > 0) { iv = br.ReadBytes(header.IvSize); var iv2 = new byte[header.IvSize]; header.IV.Memory.CopyTo(iv2); assert.Equal(iv, iv2); } if (header.SymmetricKeySize > 0) { symmetricKey = br.ReadBytes(header.SymmetricKeySize); } if (header.HashSize > 0) { hash = br.ReadBytes(header.HashSize); var hash2 = new byte[header.HashSize]; header.Hash.Memory.CopyTo(hash2); assert.Equal(hash, hash2); } assert.Null(metadata); assert.NotNull(hash); assert.NotNull(signingSalt); assert.NotNull(symmetricSalt); // header property has a copy but does not // write it to the file header when a private key // is provided. assert.Null(symmetricKey); assert.NotNull(iv); assert.NotEmpty(hash); assert.NotEmpty(signingSalt); assert.NotEmpty(symmetricSalt); assert.NotEmpty(iv); } } } }
public void GenerateHeader_WithPrivateKey() { using (var engine = new SymmetricEncryptionProvider()) { byte[] privateKey = null; using (var rng = new RandomNumberGenerator()) { privateKey = rng.NextBytes(20); } using (var options = new SymmetricEncryptionProviderOptions()) using (var header = engine.GenerateHeader(options, privateKey: privateKey)) { assert.NotNull(header); assert.Equal(1, header.Version); assert.Equal(SymmetricAlgorithmType.AES, header.SymmetricAlgorithmType); assert.Equal(KeyedHashAlgorithmType.HMACSHA256, header.KeyedHashAlgorithmType); assert.Equal(0, header.MetaDataSize); assert.NotEqual(0, header.SigningSaltSize); assert.NotEqual(0, header.SymmetricSaltSize); assert.Equal(8, header.SigningSaltSize); assert.Equal(8, header.SymmetricSaltSize); assert.NotEqual(0, header.IvSize); assert.NotEqual(0, header.HashSize); assert.NotEqual(0, header.Iterations); assert.NotNull(header.SymmetricKey); assert.NotNull(header.IV); assert.NotNull(header.SigningKey); assert.NotNull(header.Bytes); assert.Ok(!header.SymmetricKey.Memory.IsEmpty); assert.Ok(!header.IV.Memory.IsEmpty); assert.Ok(!header.SigningKey.Memory.IsEmpty); var temp = new byte[header.SymmetricKey.Memory.Length]; header.SymmetricKey.Memory.CopyTo(temp); assert.NotEqual(privateKey, temp); assert.Ok(!header.Bytes.Memory.IsEmpty); temp = new byte[header.Bytes.Memory.Length]; header.Bytes.Memory.CopyTo(temp); using (var ms = new MemoryStream(temp)) using (var br = new BinaryReader(ms)) { assert.Equal(header.Version, br.ReadInt16()); assert.Equal((short)SymmetricAlgorithmType.AES, br.ReadInt16()); assert.Equal((short)KeyedHashAlgorithmType.HMACSHA256, br.ReadInt16()); assert.Equal(header.MetaDataSize, br.ReadInt32()); assert.Equal(header.Iterations, br.ReadInt32()); assert.Equal(header.SymmetricSaltSize, br.ReadInt16()); assert.Equal(header.SigningSaltSize, br.ReadInt16()); assert.Equal(header.IvSize, br.ReadInt16()); assert.Equal(header.SymmetricKeySize, br.ReadInt16()); assert.Equal(header.HashSize, br.ReadInt16()); byte[] metadata = null; byte[] symmetricSalt = null; byte[] signingSalt = null; byte[] iv = null; byte[] symmetricKey = null; byte[] hash = null; if (header.MetaDataSize > 0) { metadata = br.ReadBytes(header.MetaDataSize); } if (header.SymmetricSaltSize > 0) { symmetricSalt = br.ReadBytes(header.SymmetricSaltSize); } if (header.SigningSaltSize > 0) { signingSalt = br.ReadBytes(header.SigningSaltSize); } if (header.IvSize > 0) { iv = br.ReadBytes(header.IvSize); } if (header.SymmetricKeySize > 0) { symmetricKey = br.ReadBytes(header.SymmetricKeySize); } if (header.HashSize > 0) { hash = br.ReadBytes(header.HashSize); } assert.Null(metadata); assert.NotNull(hash); assert.NotNull(signingSalt); assert.NotNull(symmetricSalt); // header property has a copy but does not // write it to the file header when a private key // is provided. The private key is external and is // used to generate the symmetricKey. assert.Null(symmetricKey); assert.NotNull(iv); assert.NotEmpty(hash); assert.NotEmpty(signingSalt); assert.NotEmpty(symmetricSalt); assert.NotEmpty(iv); } } } }