public void AesGcm1000Rounds() { IShadowsocksAeadCipher aes = new AEAD_AES_128_GCM("password"); byte[] raw = new byte[1024]; for (int i = 0; i < 1000; i++) { RandomNumberGenerator.Fill(raw); var c = aes.EncryptTcp(raw); var p = aes.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } aes = new AEAD_AES_192_GCM("password2"); for (int i = 0; i < 1000; i++) { RandomNumberGenerator.Fill(raw); var c = aes.EncryptTcp(raw); var p = aes.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } aes = new AEAD_AES_256_GCM("password3"); for (int i = 0; i < 1000; i++) { RandomNumberGenerator.Fill(raw); var c = aes.EncryptTcp(raw); var p = aes.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } }
public void AesGcmBasics() { byte[] raw = new byte[1024]; RandomNumberGenerator.Fill(raw); IShadowsocksAeadCipher aead = new AEAD_AES_128_GCM("password"); { var c = aead.EncryptUdp(raw); var p = aead.DecryptUdp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } { RandomNumberGenerator.Fill(raw); var c = aead.EncryptTcp(raw); var p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); RandomNumberGenerator.Fill(raw); c = aead.EncryptTcp(raw); p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); RandomNumberGenerator.Fill(raw); c = aead.EncryptTcp(raw); p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } aead = new AEAD_AES_192_GCM("password"); { RandomNumberGenerator.Fill(raw); var c = aead.EncryptUdp(raw); var p = aead.DecryptUdp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } { RandomNumberGenerator.Fill(raw); var c = aead.EncryptTcp(raw); var p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); RandomNumberGenerator.Fill(raw); c = aead.EncryptTcp(raw); p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); RandomNumberGenerator.Fill(raw); c = aead.EncryptTcp(raw); p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } aead = new AEAD_AES_256_GCM("password"); { RandomNumberGenerator.Fill(raw); var c = aead.EncryptUdp(raw); var p = aead.DecryptUdp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } { RandomNumberGenerator.Fill(raw); var c = aead.EncryptTcp(raw); var p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); RandomNumberGenerator.Fill(raw); c = aead.EncryptTcp(raw); p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); RandomNumberGenerator.Fill(raw); c = aead.EncryptTcp(raw); p = aead.DecryptTcp(c.SignificantMemory); Assert.IsTrue(p.SignificantMemory.Span.SequenceEqual(raw.AsSpan())); } }
private static ExitCode RunCryptOptionsAndReturnExitCode(CryptOptions cryptOptions) { AesEncryptionResult aesEncryptionResult = null; switch (cryptOptions.InputType.ToLower()) { case "string": { switch (cryptOptions.Algorithm.ToLower()) { case "aes128cbc": aesEncryptionResult = new AE_AES_128_CBC_HMAC_SHA_256().EncryptString(cryptOptions.InputToBeEncrypted, cryptOptions.Password); break; case "aes192cbc": aesEncryptionResult = new AE_AES_192_CBC_HMAC_SHA_384().EncryptString(cryptOptions.InputToBeEncrypted, cryptOptions.Password); break; case "aes256cbc": aesEncryptionResult = new AE_AES_256_CBC_HMAC_SHA_512().EncryptString(cryptOptions.InputToBeEncrypted, cryptOptions.Password); break; case "aes128gcm": aesEncryptionResult = new AEAD_AES_128_GCM().EncryptString(cryptOptions.InputToBeEncrypted, cryptOptions.Password, cryptOptions.AssociatedData); break; case "aes192gcm": aesEncryptionResult = new AEAD_AES_192_GCM().EncryptString(cryptOptions.InputToBeEncrypted, cryptOptions.Password, cryptOptions.AssociatedData); break; case "aes256gcm": aesEncryptionResult = new AEAD_AES_256_GCM().EncryptString(cryptOptions.InputToBeEncrypted, cryptOptions.Password, cryptOptions.AssociatedData); break; default: aesEncryptionResult = new AesEncryptionResult() { Success = false, Message = $"Unknown algorithm \"{cryptOptions.Algorithm}\"." }; break; } } break; case "file": { switch (cryptOptions.Algorithm.ToLower()) { case "aes128cbc": { using (var progressBar = new ProgressBar()) { var aes128 = new AE_AES_128_CBC_HMAC_SHA_256(); aes128.OnEncryptionProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); }; aes128.OnEncryptionMessage += (msg) => { /*Console.WriteLine(msg);*/ progressBar.WriteLine(msg); }; aesEncryptionResult = aes128.EncryptFile(cryptOptions.InputToBeEncrypted, cryptOptions.OutputFilePath, cryptOptions.Password, cryptOptions.DeleteSourceFile); } } break; case "aes192cbc": { using (var progressBar = new ProgressBar()) { var aes192 = new AE_AES_192_CBC_HMAC_SHA_384(); aes192.OnEncryptionProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); }; aes192.OnEncryptionMessage += (msg) => { /*Console.WriteLine(msg);*/ progressBar.WriteLine(msg); }; aesEncryptionResult = aes192.EncryptFile(cryptOptions.InputToBeEncrypted, cryptOptions.OutputFilePath, cryptOptions.Password, cryptOptions.DeleteSourceFile); } } break; case "aes256cbc": { using (var progressBar = new ProgressBar()) { var aes256 = new AE_AES_256_CBC_HMAC_SHA_512(); aes256.OnEncryptionProgress += (percentageDone, message) => { progressBar.Report((double)percentageDone / 100); }; aes256.OnEncryptionMessage += (msg) => { /*Console.WriteLine(msg);*/ progressBar.WriteLine(msg); }; aesEncryptionResult = aes256.EncryptFile(cryptOptions.InputToBeEncrypted, cryptOptions.OutputFilePath, cryptOptions.Password, cryptOptions.DeleteSourceFile); } } break; case "aes128gcm": case "aes192gcm": case "aes256gcm": aesEncryptionResult = new AesEncryptionResult() { Success = false, Message = $"Algorithm \"{cryptOptions.Algorithm}\" currently not available for file encryption." }; break; default: aesEncryptionResult = new AesEncryptionResult() { Success = false, Message = $"Unknown algorithm \"{cryptOptions.Algorithm}\"." }; break; } } break; default: aesEncryptionResult = new AesEncryptionResult() { Success = false, Message = $"Unknown input type \"{cryptOptions.InputType}\"." }; break; } if (aesEncryptionResult.Success) { Console.WriteLine((cryptOptions.InputType.ToLower().Equals("string") ? aesEncryptionResult.EncryptedDataBase64String : aesEncryptionResult.Message)); return(ExitCode.Sucess); } else { Console.WriteLine(aesEncryptionResult.Message); return(ExitCode.Error); } }