Example #1
0
 public void Close()
 {
     if (cOut != null)
     {
         if (digestOut != null)
         {
             BcpgOutputStream bcpgOutputStream = new BcpgOutputStream(digestOut, PacketTag.ModificationDetectionCode, 20L);
             bcpgOutputStream.Flush();
             digestOut.Flush();
             byte[] array = DigestUtilities.DoFinal(digestOut.WriteDigest());
             cOut.Write(array, 0, array.Length);
         }
         cOut.Flush();
         try
         {
             pOut.Write(c.DoFinal());
             pOut.Finish();
         }
         catch (Exception ex)
         {
             throw new IOException(ex.Message, ex);
         }
         cOut = null;
         pOut = null;
     }
 }
Example #2
0
        /// <summary>
        ///     Create decorator streams implementing the Encrypt-then-MAC scheme (CipherStream bound to a MacStream).
        /// </summary>
        /// <param name="item">Item to create resources for.</param>
        /// <param name="encryptor">Cipher stream (output).</param>
        /// <param name="authenticator">MAC stream (output).</param>
        protected void CreateEtMDecorator(PayloadItem item, out CipherStream encryptor, out MacStream authenticator)
        {
            byte[] encryptionKey, authenticationKey;
            if (item.SymmetricCipherKey.IsNullOrZeroLength() == false && item.AuthenticationKey.IsNullOrZeroLength() == false)
            {
                encryptionKey     = item.SymmetricCipherKey;
                authenticationKey = item.AuthenticationKey;
            }
            else if (PayloadItemPreKeys.ContainsKey(item.Identifier))
            {
                if (item.Authentication.KeySizeBits.HasValue == false)
                {
                    throw new ConfigurationInvalidException(
                              "Payload item authentication configuration is missing size specification of MAC key.");
                }
                KeyStretchingUtility.DeriveWorkingKeys(PayloadItemPreKeys[item.Identifier],
                                                       item.SymmetricCipher.KeySizeBits / 8,
                                                       item.Authentication.KeySizeBits.Value / 8, item.KeyDerivation, out encryptionKey,
                                                       out authenticationKey);
            }
            else
            {
                throw new ItemKeyMissingException(item);
            }

            authenticator = new MacStream(PayloadStream, Writing, item.Authentication,
                                          authenticationKey, false);
            encryptor = new CipherStream(authenticator, Writing, item.SymmetricCipher,
                                         encryptionKey, false);
        }
Example #3
0
        private object Decrypt(string dataString)
        {
            var key          = Convert.FromBase64String(subscriptionInfo.DeliveryMode.EncryptionKey);
            var keyParameter = ParameterUtilities.CreateKeyParameter("AES", key);
            var cipher       = CipherUtilities.GetCipher("AES/ECB/PKCS7Padding");

            cipher.Init(false, keyParameter);

            var data         = Convert.FromBase64String(dataString);
            var memoryStream = new MemoryStream(data, false);
            var cipherStream = new CipherStream(memoryStream, cipher, null);

            var bufferSize   = 1024;
            var buffer       = new byte[bufferSize];
            var length       = 0;
            var resultStream = new MemoryStream();

            while ((length = cipherStream.Read(buffer, 0, bufferSize)) > 0)
            {
                resultStream.Write(buffer, 0, length);
            }
            var resultBytes = resultStream.ToArray();
            var result      = Encoding.UTF8.GetString(resultBytes, 0, resultBytes.Length);

            return(JsonConvert.DeserializeObject(result));
        }
Example #4
0
        public async Task <string> LoadFirstLinesFromDiskAsync(string fileName, int lineCount, SecureString passphrase)
        {
            using (var inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
            {
                using (var outputStream = new MemoryStream())
                {
                    var password = SecureStringCredentialStore.SecureStringToString(passphrase);
                    using (var cryptoStream = CipherStream.Open(inputStream, password))
                    {
                        while (cryptoStream.CanRead)
                        {
                            var buffer = new byte[4096];
                            await cryptoStream.ReadAsync(buffer, 0, 4096);

                            await outputStream.WriteAsync(buffer, 0, 4096);

                            char[] chunk      = Encoding.UTF8.GetChars(buffer);
                            var    occurances = chunk.Count(c => c == '\n');
                            if (occurances >= lineCount)
                            {
                                break;
                            }
                        }
                    }

                    outputStream.Position = 0;
                    using (var reader = new StreamReader(outputStream))
                    {
                        return(await reader.ReadToEndAsync());
                    }
                }
            }
        }
Example #5
0
        public void AESDecryption()
        {
            var dataString = "YSholLwd6hNXsLPHW+DZQsdhFutxTGa04L6E4ySBQ4ihyjZ/7iH9VdqAiEsmFLrNNaHT+RfGAJfqmwoAfS2E0uJI/dY3UkuiBq152iKnoWkEhphdkAeerQwBbCCl82F6/2ezoyBbTomwkalyV32djQF7Xh5jxJGw1xorldxX6WUJ/a3g4EPU7zAIVBElx+kOJm4TwfiznJoNAArVFp96MxjDe4aHrVNpPSFzQrVKdgTVsXuqTaX5j0Dq1bHfZZ539L7C/yTT1mSCO9BCWdyclquDdKwf40V+Up0eMYgV8tGMqI5r0I8OaU7djD66Jv/HICikqFOLwPoHj7uQby/SXMKPKxA/7UVfDFeNHrC7ZXdIj2LDv7NC2WHG/c92qDoORbuO20+dLWUGqyKnwYx4Xh7EqBfVM2uQErbH9pk2DZ1WL93I6zdoGtRwzQBI7GwRY0KtPchJICdHkjA42s3U0g==";
            var keyString  = "1q3kw4BhAAtT0SJkZ0a8EA==";
            var expected   = "{\"uuid\":\"3622482f-465b-4f6b-9beb-44f508b59016\",\"event\":\"/restapi/v1.0/account/~/extension/850957020/message-store\",\"timestamp\":\"2016-05-25T00:54:36.834Z\",\"subscriptionId\":\"57b5d366-ab22-490b-9754-b60fa6aab373\",\"body\":{\"extensionId\":850957020,\"lastUpdated\":\"2016-05-25T00:54:22.055+0000\",\"changes\":[{\"type\":\"SMS\",\"newCount\":0,\"updatedCount\":1}]}}";

            var key          = Convert.FromBase64String(keyString);
            var keyParameter = ParameterUtilities.CreateKeyParameter("AES", key);
            var cipher       = CipherUtilities.GetCipher("AES/ECB/PKCS7Padding");

            cipher.Init(false, keyParameter);

            var data         = Convert.FromBase64String(dataString);
            var memoryStream = new MemoryStream(data, false);
            var cipherStream = new CipherStream(memoryStream, cipher, null);

            var bufferSize   = 1024;
            var buffer       = new byte[bufferSize];
            var length       = 0;
            var resultStream = new MemoryStream();

            while ((length = cipherStream.Read(buffer, 0, bufferSize)) > 0)
            {
                resultStream.Write(buffer, 0, length);
            }
            var result = Encoding.UTF8.GetString(resultStream.ToArray());

            Assert.AreEqual(expected, result);
        }
Example #6
0
        public static string DecryptForJava(string input, string key)
        {
            var inputArrary = Convert.FromBase64String(input);

            var outCipher = CreateCipher(false, key);

            var encryptedDataStream = new MemoryStream(inputArrary, false);

            var dataStream = new MemoryStream();

            var outCipherStream = new CipherStream(dataStream, null, outCipher);

            int ch;

            while ((ch = encryptedDataStream.ReadByte()) >= 0)
            {
                outCipherStream.WriteByte((byte)ch);
            }

            outCipherStream.Close();
            encryptedDataStream.Close();

            var dataBytes = dataStream.ToArray();

            return(Encoding.UTF8.GetString(dataBytes));
        }
        private static byte[] RSAEncryptData(AsymmetricKeyParameter publicKey, byte[] originalDataBytes)
        {
            bool isEncryption = true;

            byte[] encryptedDataArray;

            using (MemoryStream originalDataStream = new MemoryStream(originalDataBytes, false))
            {
                using (MemoryStream encryptedDataStream = new MemoryStream())
                {
                    IBufferedCipher rsacipher = RSACreateCipher(isEncryption, publicKey);
                    using (CipherStream cipherStream = new CipherStream(originalDataStream, rsacipher, null))
                    {
                        int oneByte;
                        while ((oneByte = cipherStream.ReadByte()) >= 0)
                        {
                            encryptedDataStream.WriteByte((byte)oneByte);
                        }

                        cipherStream.Close();
                        cipherStream.Dispose();
                    }

                    encryptedDataArray = encryptedDataStream.ToArray();

                    encryptedDataStream.Close();
                    encryptedDataStream.Dispose();
                }

                originalDataStream.Close();
                originalDataStream.Dispose();
            }
            return(encryptedDataArray);
        }
Example #8
0
        // "private class Pkcs12Test" @ https://github.com/bcgit/bc-csharp/blob/b19e68a517e56ef08cd2e50df4dcb8a96ddbe507/crypto/test/src/test/PBETest.cs
        // https://github.com/bcgit/bc-csharp/blob/b19e68a517e56ef08cd2e50df4dcb8a96ddbe507/crypto/src/crypto/generators/Pkcs12ParametersGenerator.cs
        // https://github.com/bcgit/bc-csharp/blob/master/crypto/src/crypto/BufferedStreamCipher.cs
        // https://github.com/bcgit/bc-csharp/blob/master/crypto/src/crypto/io/CipherStream.cs
        // https://forum.facepunch.com/f/nerds/payx/How-can-I-encrypt-a-txt-file/1/#posticazt
        public static void EncryptStreamPBE(
            Action <Stream> streamWriter,
            Stream outStream,
            EncryptionAlgorithm algorithm,
            string key)
        {
            var pbeAlg = PBEAlgorithmMap[algorithm];
            var digest = pbeAlg.Digest;

            byte[] salt = DigestUtilities.DoFinal(digest);

            PbeParametersGenerator pGen = new Pkcs12ParametersGenerator(digest);

            pGen.Init(
                PbeParametersGenerator.Pkcs12PasswordToBytes(key.ToArray()),
                salt,
                IterationCount);

            ParametersWithIV parameters = (ParametersWithIV)
                                          pGen.GenerateDerivedParameters(pbeAlg.BaseAlgorithm, pbeAlg.KeySize, pbeAlg.IVSize);
            KeyParameter encKey = (KeyParameter)parameters.Parameters;

            IBufferedCipher c = CipherUtilities.GetCipher(pbeAlg.BaseAlgorithm + "/CBC/PKCS7Padding");

            c.Init(true, parameters);

            using (CipherStream encStream = new CipherStream(outStream, null, c))
            {
                streamWriter(encStream);
            }
        }
Example #9
0
 public void Close()
 {
     //IL_008c: Unknown result type (might be due to invalid IL or missing references)
     if (cOut != null)
     {
         if (digestOut != null)
         {
             BcpgOutputStream bcpgOutputStream = new BcpgOutputStream((Stream)(object)digestOut, PacketTag.ModificationDetectionCode, 20L);
             ((Stream)bcpgOutputStream).Flush();
             ((Stream)digestOut).Flush();
             byte[] array = DigestUtilities.DoFinal(digestOut.WriteDigest());
             ((Stream)cOut).Write(array, 0, array.Length);
         }
         ((Stream)cOut).Flush();
         try
         {
             pOut.Write(c.DoFinal());
             pOut.Finish();
         }
         catch (global::System.Exception ex)
         {
             throw new IOException(ex.get_Message(), ex);
         }
         cOut = null;
         pOut = null;
     }
 }
Example #10
0
        protected void RunSegmentedVectorTest(int number, SegmentedVectorTestCase testCase)
        {
            CipherConfiguration config = GetCipherConfiguration(testCase);
            var plaintext = new byte[testCase.IV.Length];
            TestVectorSegment lastSegment = testCase.Segments.Last();
            int requiredCiphertextLength  = lastSegment.Offset + lastSegment.Length;
            var msCiphertext = new MemoryStream();

            using (var cs = new CipherStream(msCiphertext, true, config, testCase.Key, false)) {
                while (cs.BytesOut < requiredCiphertextLength)
                {
                    cs.Write(plaintext, 0, plaintext.Length);
                }
            }

            // Now we analyse the ciphertext segment-wise
            foreach (var segment in testCase.Segments)
            {
                msCiphertext.Seek(segment.Offset, SeekOrigin.Begin);
                var segmentCiphertext = new byte[segment.Length];
                msCiphertext.Read(segmentCiphertext, 0, segment.Length);
                byte[] referenceCiphertext = segment.Ciphertext;
                // Validate the segment
                Assert.IsTrue(referenceCiphertext.SequenceEqualShortCircuiting(segmentCiphertext),
                              "Segmented vector test #{0} (\"{1}\") failed at segment {2}!",
                              number, testCase.Name, segment.Name);
            }
        }
Example #11
0
        private void DescriptionTest(CipherDescription Description)
        {
            AllocateRandom(ref _iv, 16);
            AllocateRandom(ref _key, 32);
            AllocateRandom(ref _plnText);

            KeyParams    kp   = new KeyParams(_key, _iv);
            MemoryStream mIn  = new MemoryStream(_plnText);
            MemoryStream mOut = new MemoryStream();
            MemoryStream mRes = new MemoryStream();

            CipherStream cs = new CipherStream(Description);

            cs.Initialize(true, kp);
            cs.Write(mIn, mOut);

            mOut.Seek(0, SeekOrigin.Begin);

            cs.Initialize(false, kp);
            cs.Write(mOut, mRes);

            if (!Evaluate.AreEqual(mRes.ToArray(), _plnText))
            {
                throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
            }
        }
Example #12
0
        private static async Task <(MemoryStream output, IMS2SizeHeader size)> InternalGetEncryptionStreamAsync(Stream input, long inputSize, IBufferedCipher cipher, long headerSize)
        {
            byte[] inputBytes = new byte[inputSize];
            int    read       = await input.ReadAsync(inputBytes, 0, (int)inputSize).ConfigureAwait(false);

            if (inputSize != read)
            {
                throw new EndOfStreamException();
            }
            using var msInput = new MemoryStream(inputBytes);

            using var cs = new CipherStream(msInput, cipher, null);
            using var ms = new MemoryStream();

            var output = new MemoryStream();
            await cs.CopyToAsync(ms).ConfigureAwait(false);

            var data    = ms.ToArray();
            var encoder = new Base64Encoder();

            encoder.Encode(data, 0, data.Length, output);

            var header = new MS2SizeHeader(output.Length, inputSize, headerSize);

            output.Position = 0;
            return(output, header);
        }
 public CmsEnvelopedDataOutputStream(CmsEnvelopedGenerator outer, CipherStream outStream, BerSequenceGenerator cGen, BerSequenceGenerator envGen, BerSequenceGenerator eiGen)
 {
     _outer  = outer;
     _out    = outStream;
     _cGen   = cGen;
     _envGen = envGen;
     _eiGen  = eiGen;
 }
Example #14
0
        public MonoAesStream(System.IO.Stream stream, byte[] key)
        {
            BaseStream = stream;
            BufferedBlockCipher enc = GenerateAES(key, true);
            BufferedBlockCipher dec = GenerateAES(key, false);

            cstream = new CipherStream(stream, dec, enc);
        }
        public Stream BcDecryptStream(Stream inputStream)
        {
            var cipher = CipherUtilities.GetCipher("ChaCha20-Poly1305");

            cipher.Init(false, new ParametersWithIV(new KeyParameter(Key), Iv));
            var cs = new CipherStream(inputStream, cipher, cipher);

            return(cs);
        }
Example #16
0
        public void EncriptChannel(byte[] secretKey)
        {
            var output = new BufferedBlockCipher(new CfbBlockCipher(new AesFastEngine(), 8));

            output.Init(true, new ParametersWithIV(new KeyParameter(secretKey), secretKey, 0, 16));
            var input = new BufferedBlockCipher(new CfbBlockCipher(new AesFastEngine(), 8));

            input.Init(false, new ParametersWithIV(new KeyParameter(secretKey), secretKey, 0, 16));
            var cipherStream = new CipherStream(client.GetStream(), input, output);

            streamWrapper = new StreamWrapper(cipherStream);
        }
 private Stream Open(Stream outStream, AlgorithmIdentifier encAlgID, ICipherParameters cipherParameters, Asn1EncodableVector recipientInfos)
 {
     //IL_0120: Expected O, but got Unknown
     try
     {
         BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);
         berSequenceGenerator.AddObject(CmsObjectIdentifiers.EnvelopedData);
         BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, isExplicit: true);
         berSequenceGenerator2.AddObject(Version);
         Stream        rawOutputStream = berSequenceGenerator2.GetRawOutputStream();
         Asn1Generator asn1Generator   = (_berEncodeRecipientSet ? ((Asn1Generator) new BerSetGenerator(rawOutputStream)) : ((Asn1Generator) new DerSetGenerator(rawOutputStream)));
         global::System.Collections.IEnumerator enumerator = recipientInfos.GetEnumerator();
         try
         {
             while (enumerator.MoveNext())
             {
                 Asn1Encodable obj = (Asn1Encodable)enumerator.get_Current();
                 asn1Generator.AddObject(obj);
             }
         }
         finally
         {
             global::System.IDisposable disposable = enumerator as global::System.IDisposable;
             if (disposable != null)
             {
                 disposable.Dispose();
             }
         }
         asn1Generator.Close();
         BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(rawOutputStream);
         berSequenceGenerator3.AddObject(CmsObjectIdentifiers.Data);
         berSequenceGenerator3.AddObject(encAlgID);
         Stream          stream = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, isExplicit: false, _bufferSize);
         IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.Algorithm);
         cipher.Init(forEncryption: true, new ParametersWithRandom(cipherParameters, rand));
         CipherStream outStream2 = new CipherStream(stream, null, cipher);
         return((Stream)(object)new CmsEnvelopedDataOutputStream(this, outStream2, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3));
     }
     catch (SecurityUtilityException e)
     {
         throw new CmsException("couldn't create cipher.", e);
     }
     catch (InvalidKeyException e2)
     {
         throw new CmsException("key invalid in message.", e2);
     }
     catch (IOException val)
     {
         IOException e3 = val;
         throw new CmsException("exception decoding algorithm parameters.", (global::System.Exception)(object) e3);
     }
 }
Example #18
0
 public MuxItemResourceContainer(CipherStream encryptor, MacStream authenticator, int?bufferCapacity)
 {
     Encryptor     = encryptor;
     Authenticator = authenticator;
     if (bufferCapacity != null)
     {
         Buffer = new Lazy <RingBufferStream>(() => new RingBufferStream(bufferCapacity.Value, false));
     }
     else
     {
         SkippedLength = 0;
     }
 }
Example #19
0
        // Performance testing resources (not called in this base class, but called from derived classes)

        protected void RunPerformanceTest(CipherConfiguration config, byte[] overrideKey = null)
        {
            MemoryStream msInputPlaintext = LargeBinaryFile;

            byte[] key = overrideKey ?? CreateRandomByteArray(config.KeySizeBits);

            var msCiphertext = new MemoryStream((int)(msInputPlaintext.Length * 1.1));
            var sw           = new Stopwatch();

            // TEST STARTS HERE

            using (var cs = new CipherStream(msCiphertext, true, config, key, false)) {
                sw.Start();
                msInputPlaintext.CopyTo(cs, GetBufferSize());
            }
            sw.Stop();
            TimeSpan encryptionElapsed = sw.Elapsed;

            var msOutputPlaintext = new MemoryStream((int)msInputPlaintext.Length);

            msCiphertext.Seek(0, SeekOrigin.Begin);

            sw.Reset();
            using (var cs = new CipherStream(msCiphertext, false, config, key, false)) {
                sw.Start();
                cs.CopyTo(msOutputPlaintext, GetBufferSize());
            }
            sw.Stop();
            TimeSpan decryptionElapsed = sw.Elapsed;

            // TEST ENDS HERE

            // TEST OUTPUT PLAINTEXT VALIDITY

            msInputPlaintext.Seek(0, SeekOrigin.Begin);
            msOutputPlaintext.Seek(0, SeekOrigin.Begin);
            int failurePosition;

            Assert.IsTrue(StreamsContentMatches(msInputPlaintext, msOutputPlaintext, (int)msInputPlaintext.Length, out failurePosition),
                          "Input and output plaintext does not match. First failure observed at position # " + failurePosition);

            // OUTPUT SUCCESS STATISTICS

            double encSpeed = ((double)msInputPlaintext.Length / 1048576) / encryptionElapsed.TotalSeconds,
                   decSpeed =
                ((double)msInputPlaintext.Length / 1048576) / decryptionElapsed.TotalSeconds;

            Assert.Pass("{0:N0} ms ({1:N2} MB/s) : {2:N0} ms ({3:N2} MB/s)",
                        encryptionElapsed.TotalMilliseconds, encSpeed, decryptionElapsed.TotalMilliseconds, decSpeed);
        }
		private byte[] encryptOnWrite(byte[] dataBytes)
		{
			MemoryStream encryptedDataStream = new MemoryStream();
			IBufferedCipher outCipher = createCipher(true);
			CipherStream outCipherStream = new CipherStream(encryptedDataStream, null, outCipher);
			outCipherStream.Write(dataBytes, 0, dataBytes.Length);
			Assert.AreEqual(0L, encryptedDataStream.Position % outCipher.GetBlockSize());

			outCipherStream.Close();
			byte[] encryptedDataBytes = encryptedDataStream.ToArray();
			Assert.AreEqual(dataBytes.Length, encryptedDataBytes.Length);

			return encryptedDataBytes;
		}
Example #21
0
        private byte[] encryptOnWrite(byte[] dataBytes)
        {
            MemoryStream    encryptedDataStream = new MemoryStream();
            IBufferedCipher outCipher           = createCipher(true);
            CipherStream    outCipherStream     = new CipherStream(encryptedDataStream, null, outCipher);

            outCipherStream.Write(dataBytes, 0, dataBytes.Length);
            Assert.AreEqual(0L, encryptedDataStream.Position % outCipher.GetBlockSize());

            outCipherStream.Close();
            byte[] encryptedDataBytes = encryptedDataStream.ToArray();
            Assert.AreEqual(dataBytes.Length, encryptedDataBytes.Length);

            return(encryptedDataBytes);
        }
        public Stream BcEncryptStream(Stream inputStream)
        {
            CipherKeyGenerator gen = GeneratorUtilities.GetKeyGenerator("ChaCha20-Poly1305");
            var cipher             = CipherUtilities.GetCipher("ChaCha20-Poly1305");

            Key = gen.GenerateKey();
            SecureRandom random = new SecureRandom();

            Iv = new byte[12];
            random.NextBytes(Iv);
            cipher.Init(true, new ParametersWithIV(new KeyParameter(Key), Iv));
            var cs = new CipherStream(inputStream, cipher, null);

            return(cs);
        }
Example #23
0
        protected void RunDiscreteVectorTest(int number, DiscreteVectorTestCase testCase)
        {
            CipherConfiguration config = GetCipherConfiguration(testCase);

            byte[] plaintext = testCase.Plaintext;

            byte[] ciphertext;
            using (var msCiphertext = new MemoryStream()) {
                using (var cs = new CipherStream(msCiphertext, true, config, testCase.Key, false)) {
                    cs.Write(plaintext, 0, plaintext.Length);
                }
                ciphertext = msCiphertext.ToArray();
            }

            Assert.IsTrue(testCase.Ciphertext.SequenceEqualShortCircuiting(ciphertext),
                          "Test #{0} (\"{1}\") failed!", number, testCase.Name);
        }
Example #24
0
        public static byte[] AESEncryptData(byte[] originalDataBytes, byte[] aesKeyByteData, byte[] iv = null)
        {
            bool isEncryption = true;

            MemoryStream    originalDataStream  = new MemoryStream(originalDataBytes, false);
            MemoryStream    encryptedDataStream = new MemoryStream();
            IBufferedCipher aesCipher           = AESCreateCipher(isEncryption, aesKeyByteData, iv);
            CipherStream    cipherStream        = new CipherStream(originalDataStream, aesCipher, null);

            int oneByte;

            while ((oneByte = cipherStream.ReadByte()) >= 0)
            {
                encryptedDataStream.WriteByte((byte)oneByte);
            }
            encryptedDataStream.Close();
            cipherStream.Close();

            return(encryptedDataStream.ToArray());
        }
Example #25
0
        void StreamModesTest(ICipherMode Cipher, IPadding Padding)
        {
            if (Cipher.Engine.LegalKeySizes[0] > 32)
            {
                AllocateRandom(ref _key, 192);
            }
            else
            {
                AllocateRandom(ref _key, 32);
            }

            AllocateRandom(ref _iv, 16);
            // we are testing padding modes, make sure input size is random, but -not- block aligned..
            AllocateRandom(ref _plnText, 0, Cipher.BlockSize);

            KeyParams    kp   = new KeyParams(_key, _iv);
            MemoryStream mIn  = new MemoryStream(_plnText);
            MemoryStream mOut = new MemoryStream();
            MemoryStream mRes = new MemoryStream();

            CipherStream cs = new CipherStream(Cipher, Padding);

            cs.Initialize(true, kp);
            cs.Write(mIn, mOut);

            cs.Initialize(false, kp);
            mOut.Seek(0, SeekOrigin.Begin);
            cs.Write(mOut, mRes);

            int pos = (int)mRes.Position;

            byte[] res = new byte[_plnText.Length];
            Buffer.BlockCopy(mRes.ToArray(), 0, res, 0, pos);

            if (!Evaluate.AreEqual(res, _plnText))
            {
                throw new Exception("CipherStreamTest: Encrypted arrays are not equal!");
            }

            Cipher.Dispose();
        }
Example #26
0
        public void Constructor_PassReference_Pass()
        {
            string passwd = "superpassword";
            byte[] salt = {
                              1,2,3,4,5,6,7,8,9
                          };

            Cipher originCipher;
            Cipher handlerCipher;

            using(SymmetricCipher<AesManaged> cipher = new SymmetricCipher<AesManaged>(passwd, salt))
            {
                using(var handler = new CipherStream<AesManaged>(cipher))
                {
                    handlerCipher = handler.Cipher;
                }
                originCipher = cipher;

                Assert.ReferenceEquals(originCipher, handlerCipher);
            }
        }
Example #27
0
        /// <summary>
        /// Initialize the cipher instance
        /// </summary>
        ///
        /// <param name="KeyStream">A stream containing a volume key</param>
        public void Initialize(Stream KeyStream)
        {
            m_keyStream = KeyStream;
            m_volumeKey = new VolumeKey(KeyStream);

            if (!CipherDescription.IsValid(m_volumeKey.Description))
            {
                throw new CryptoProcessingException("VolumeCipher:Initialize", "The key Header is invalid!", new ArgumentException());
            }

            CipherDescription dsc = m_volumeKey.Description;

            try
            {
                m_cipherStream = new CipherStream(dsc);
            }
            catch (Exception ex)
            {
                throw new CryptoProcessingException("VolumeCipher:Initialize", "The cipher could not be initialized!", ex);
            }
        }
		private byte[] encryptOnRead(byte[] dataBytes)
		{
			MemoryStream dataStream = new MemoryStream(dataBytes, false);
			MemoryStream encryptedDataStream = new MemoryStream();
			IBufferedCipher inCipher = createCipher(true);
			CipherStream inCipherStream = new CipherStream(dataStream, inCipher, null);

			int ch;
			while ((ch = inCipherStream.ReadByte()) >= 0)
			{
				encryptedDataStream.WriteByte((byte) ch);
			}

			encryptedDataStream.Close();
			inCipherStream.Close();

			byte[] encryptedDataBytes = encryptedDataStream.ToArray();
			Assert.AreEqual(dataBytes.Length, encryptedDataBytes.Length);

			return encryptedDataBytes;
		}
Example #29
0
        public static byte[] AESDecryptData(byte[] encryptedDataBytes, byte[] aesKeyByteData, byte[] iv = null)
        {
            bool isEncryption = false;

            MemoryStream    enryptedDataSream   = new MemoryStream(encryptedDataBytes, false);
            MemoryStream    decryptedDataStream = new MemoryStream();
            IBufferedCipher aesCipher           = AESCreateCipher(isEncryption, aesKeyByteData, iv);
            CipherStream    decodedCipherStream = new CipherStream(enryptedDataSream, aesCipher, null);

            int oneByte;

            while ((oneByte = decodedCipherStream.ReadByte()) >= 0)
            {
                decryptedDataStream.WriteByte((byte)oneByte);
            }

            decodedCipherStream.Close();
            decryptedDataStream.Close();

            return(decryptedDataStream.ToArray());
        }
Example #30
0
        private static byte[] RSAEntschluesselDaten(AsymmetricKeyParameter privateKey, byte[] encryptedDataBytes)
        {
            bool isEncryption = false;

            MemoryStream    enryptedDataSream   = new MemoryStream(encryptedDataBytes, false);
            MemoryStream    decryptedDataStream = new MemoryStream();
            IBufferedCipher aesCipher           = RSACreateCipher(isEncryption, privateKey);
            CipherStream    decodedCipherStream = new CipherStream(enryptedDataSream, aesCipher, null);

            int oneByte;

            while ((oneByte = decodedCipherStream.ReadByte()) >= 0)
            {
                decryptedDataStream.WriteByte((byte)oneByte);
            }

            decodedCipherStream.Close();
            decryptedDataStream.Close();

            return(decryptedDataStream.ToArray());
        }
        private Stream Open(Stream outStream, AlgorithmIdentifier encAlgID, ICipherParameters cipherParameters, Asn1EncodableVector recipientInfos)
        {
            Stream result;

            try
            {
                BerSequenceGenerator berSequenceGenerator = new BerSequenceGenerator(outStream);
                berSequenceGenerator.AddObject(CmsObjectIdentifiers.EnvelopedData);
                BerSequenceGenerator berSequenceGenerator2 = new BerSequenceGenerator(berSequenceGenerator.GetRawOutputStream(), 0, true);
                berSequenceGenerator2.AddObject(this.Version);
                Stream        rawOutputStream = berSequenceGenerator2.GetRawOutputStream();
                Asn1Generator asn1Generator   = this._berEncodeRecipientSet ? new BerSetGenerator(rawOutputStream) : new DerSetGenerator(rawOutputStream);
                foreach (Asn1Encodable obj in recipientInfos)
                {
                    asn1Generator.AddObject(obj);
                }
                asn1Generator.Close();
                BerSequenceGenerator berSequenceGenerator3 = new BerSequenceGenerator(rawOutputStream);
                berSequenceGenerator3.AddObject(CmsObjectIdentifiers.Data);
                berSequenceGenerator3.AddObject(encAlgID);
                Stream          stream = CmsUtilities.CreateBerOctetOutputStream(berSequenceGenerator3.GetRawOutputStream(), 0, false, this._bufferSize);
                IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.ObjectID);
                cipher.Init(true, new ParametersWithRandom(cipherParameters, this.rand));
                CipherStream outStream2 = new CipherStream(stream, null, cipher);
                result = new CmsEnvelopedDataStreamGenerator.CmsEnvelopedDataOutputStream(this, outStream2, berSequenceGenerator, berSequenceGenerator2, berSequenceGenerator3);
            }
            catch (SecurityUtilityException e)
            {
                throw new CmsException("couldn't create cipher.", e);
            }
            catch (InvalidKeyException e2)
            {
                throw new CmsException("key invalid in message.", e2);
            }
            catch (IOException e3)
            {
                throw new CmsException("exception decoding algorithm parameters.", e3);
            }
            return(result);
        }
Example #32
0
        private byte[] encryptOnRead(byte[] dataBytes)
        {
            MemoryStream    dataStream          = new MemoryStream(dataBytes, false);
            MemoryStream    encryptedDataStream = new MemoryStream();
            IBufferedCipher inCipher            = createCipher(true);
            CipherStream    inCipherStream      = new CipherStream(dataStream, inCipher, null);

            int ch;

            while ((ch = inCipherStream.ReadByte()) >= 0)
            {
                encryptedDataStream.WriteByte((byte)ch);
            }

            encryptedDataStream.Close();
            inCipherStream.Close();

            byte[] encryptedDataBytes = encryptedDataStream.ToArray();
            Assert.AreEqual(dataBytes.Length, encryptedDataBytes.Length);

            return(encryptedDataBytes);
        }
        /// <summary>
        ///     <p>
        ///         Close off the encrypted object - this is equivalent to calling Close() on the stream
        ///         returned by the Open() method.
        ///     </p>
        ///     <p>
        ///         <b>Note</b>: This does not close the underlying output stream, only the stream on top of
        ///         it created by the Open() method.
        ///     </p>
        /// </summary>
        public void Close()
        {
            if (_cOut == null)
            {
                return;
            }

            // TODO Should this all be under the try/catch block?
            if (_digestOut != null)
            {
                //
                // hand code a mod detection packet
                //
                var bOut = new BcpgOutputStream(
                    _digestOut, PacketTag.ModificationDetectionCode, 20);

                bOut.Flush();
                _digestOut.Flush();

                // TODO
                var dig = DigestUtilities.DoFinal(_digestOut.WriteDigest());
                _cOut.Write(dig, 0, dig.Length);
            }

            _cOut.Flush();

            try
            {
                _pOut.Write(_c.DoFinal());
                _pOut.Finish();
            }
            catch (Exception e)
            {
                throw new IOException(e.Message, e);
            }

            _cOut = null;
            _pOut = null;
        }
		private byte[] decryptOnWrite(byte[] encryptedDataBytes)
		{
			MemoryStream encryptedDataStream = new MemoryStream(encryptedDataBytes, false);
			MemoryStream dataStream = new MemoryStream();
			IBufferedCipher outCipher = createCipher(false);
			CipherStream outCipherStream = new CipherStream(dataStream, null, outCipher);

			int ch;
			while ((ch = encryptedDataStream.ReadByte()) >= 0)
			{
				outCipherStream.WriteByte((byte) ch);
			}

			outCipherStream.Close();
			encryptedDataStream.Close();

			byte[] dataBytes = dataStream.ToArray();
			Assert.AreEqual(encryptedDataBytes.Length, dataBytes.Length);

			return dataBytes;
		}