Esempio n. 1
0
        private static Stream CreateStream(Stream s, bool bEncrypt, byte[] pbKey, byte[] pbIV)
        {
            StandardAesEngine.ValidateArguments(s, bEncrypt, pbKey, pbIV);

#if KeePassUAP
            return(StandardAesEngineExt.CreateStream(s, bEncrypt, pbKey, pbIV));
#else
            SymmetricAlgorithm a = CryptoUtil.CreateAes();
            if (a.BlockSize != 128)            // AES block size
            {
                Debug.Assert(false);
                a.BlockSize = 128;
            }
            a.KeySize = 256;
            a.Mode    = SaeCipherMode;
            a.Padding = SaePaddingMode;

            ICryptoTransform t;
            if (bEncrypt)
            {
                t = a.CreateEncryptor(pbKey, pbIV);
            }
            else
            {
                t = a.CreateDecryptor(pbKey, pbIV);
            }
            if (t == null)
            {
                Debug.Assert(false); throw new SecurityException("Unable to create AES transform!");
            }

            return(new CryptoStreamEx(s, t, bEncrypt ? CryptoStreamMode.Write :
                                      CryptoStreamMode.Read, a));
#endif
        }
        private static Stream CreateStream(Stream s, bool bEncrypt, byte[] pbKey, byte[] pbIV)
        {
            StandardAesEngine.ValidateArguments(s, bEncrypt, pbKey, pbIV);

            RijndaelManaged r = new RijndaelManaged();

            byte[] pbLocalIV = new byte[16];
            Array.Copy(pbIV, pbLocalIV, 16);
            r.IV = pbLocalIV;

            byte[] pbLocalKey = new byte[32];
            Array.Copy(pbKey, pbLocalKey, 32);
            r.KeySize = 256;
            r.Key     = pbLocalKey;

            r.Mode    = m_rCipherMode;
            r.Padding = m_rCipherPadding;

            ICryptoTransform iTransform = (bEncrypt ? r.CreateEncryptor() : r.CreateDecryptor());

            Debug.Assert(iTransform != null);
            if (iTransform == null)
            {
                throw new SecurityException("Unable to create Rijndael transform!");
            }

            return(new CryptoStream(s, iTransform, bEncrypt ? CryptoStreamMode.Write :
                                    CryptoStreamMode.Read));
        }
Esempio n. 3
0
        private static Stream CreateStream(Stream s, bool bEncrypt, byte[] pbKey, byte[] pbIV)
        {
            StandardAesEngine.ValidateArguments(s, bEncrypt, pbKey, pbIV);

            byte[] pbLocalIV = new byte[16];
            Array.Copy(pbIV, pbLocalIV, 16);

            byte[] pbLocalKey = new byte[32];
            Array.Copy(pbKey, pbLocalKey, 32);


#if KeePassUWP
            var cbc = new CbcBlockCipher(new AesEngine());
            var bc  = new PaddedBufferedBlockCipher(cbc,
                                                    new Pkcs7Padding());
            var kp    = new KeyParameter(pbLocalKey);
            var prmIV = new ParametersWithIV(kp, pbLocalIV);
            bc.Init(bEncrypt, prmIV);

            var cpRead  = (bEncrypt ? null : bc);
            var cpWrite = (bEncrypt ? bc : null);
            return(new CipherStream(s, cpRead, cpWrite));
#elif KeePassUAP
            return(StandardAesEngineExt.CreateStream(s, bEncrypt, pbLocalKey, pbLocalIV));
#else
            SymmetricAlgorithm a = CryptoUtil.CreateAes();
            if (a.BlockSize != 128)            // AES block size
            {
                Debug.Assert(false);
                a.BlockSize = 128;
            }

            a.IV      = pbLocalIV;
            a.KeySize = 256;
            a.Key     = pbLocalKey;
            a.Mode    = m_rCipherMode;
            a.Padding = m_rCipherPadding;

            ICryptoTransform iTransform = (bEncrypt ? a.CreateEncryptor() : a.CreateDecryptor());
            Debug.Assert(iTransform != null);
            if (iTransform == null)
            {
                throw new SecurityException("Unable to create AES transform!");
            }

            return(new CryptoStream(s, iTransform, bEncrypt ? CryptoStreamMode.Write :
                                    CryptoStreamMode.Read));
#endif
        }
Esempio n. 4
0
        private static Stream CreateStream(Stream s, bool bEncrypt, byte[] pbKey, byte[] pbIV)
        {
            StandardAesEngine.ValidateArguments(s, bEncrypt, pbKey, pbIV);

            byte[] pbLocalIV = new byte[16];
            Array.Copy(pbIV, pbLocalIV, 16);

            byte[] pbLocalKey = new byte[32];
            Array.Copy(pbKey, pbLocalKey, 32);

#if !KeePassRT
            RijndaelManaged r = new RijndaelManaged();
            if (r.BlockSize != 128)            // AES block size
            {
                Debug.Assert(false);
                r.BlockSize = 128;
            }

            r.IV      = pbLocalIV;
            r.KeySize = 256;
            r.Key     = pbLocalKey;
            r.Mode    = m_rCipherMode;
            r.Padding = m_rCipherPadding;

            ICryptoTransform iTransform = (bEncrypt ? r.CreateEncryptor() : r.CreateDecryptor());
            Debug.Assert(iTransform != null);
            if (iTransform == null)
            {
                throw new SecurityException("Unable to create Rijndael transform!");
            }

            return(new CryptoStream(s, iTransform, bEncrypt ? CryptoStreamMode.Write :
                                    CryptoStreamMode.Read));
#else
            AesEngine                 aes = new AesEngine();
            CbcBlockCipher            cbc = new CbcBlockCipher(aes);
            PaddedBufferedBlockCipher bc  = new PaddedBufferedBlockCipher(cbc,
                                                                          new Pkcs7Padding());
            KeyParameter     kp    = new KeyParameter(pbLocalKey);
            ParametersWithIV prmIV = new ParametersWithIV(kp, pbLocalIV);
            bc.Init(bEncrypt, prmIV);

            IBufferedCipher cpRead  = (bEncrypt ? null : bc);
            IBufferedCipher cpWrite = (bEncrypt ? bc : null);
            return(new CipherStream(s, cpRead, cpWrite));
#endif
        }
Esempio n. 5
0
        private static Stream CreateStream(Stream s, bool bEncrypt, byte[] pbKey, byte[] pbIV)
        {
            StandardAesEngine.ValidateArguments(s, bEncrypt, pbKey, pbIV);

            byte[] pbLocalIV = new byte[16];
            Array.Copy(pbIV, pbLocalIV, 16);

            byte[] pbLocalKey = new byte[32];
            Array.Copy(pbKey, pbLocalKey, 32);

#if KeePassUAP
            return(StandardAesEngineExt.CreateStream(s, bEncrypt, pbLocalKey, pbLocalIV));
#else
            SymmetricAlgorithm a = CryptoUtil.CreateAes();
            if (a.BlockSize != 128)            // AES block size
            {
                Debug.Assert(false);
                a.BlockSize = 128;
            }

            a.IV      = pbLocalIV;
            a.KeySize = 256;
            a.Key     = pbLocalKey;
            a.Mode    = m_rCipherMode;
            a.Padding = m_rCipherPadding;

            ICryptoTransform iTransform = (bEncrypt ? a.CreateEncryptor() : a.CreateDecryptor());
            Debug.Assert(iTransform != null);
            if (iTransform == null)
            {
                throw new SecurityException("Unable to create AES transform!");
            }

            return(new CryptoStream(s, iTransform, bEncrypt ? CryptoStreamMode.Write :
                                    CryptoStreamMode.Read));
#endif
        }
Esempio n. 6
0
 public Stream DecryptStream(Stream sEncrypted, byte[] pbKey, byte[] pbIV)
 {
     return(StandardAesEngine.CreateStream(sEncrypted, false, pbKey, pbIV));
 }
Esempio n. 7
0
 public Stream EncryptStream(Stream sPlainText, byte[] pbKey, byte[] pbIV)
 {
     return(StandardAesEngine.CreateStream(sPlainText, true, pbKey, pbIV));
 }
Esempio n. 8
0
        /// <summary>
        /// A method for generating encrypted ChallengeInfo to be saved. For security, this method should
        /// be called every time you get a successful challenge-response pair from the Yubikey. Failure to
        /// do so will permit password re-use attacks. 
        /// </summary>
        /// <param name="secret">The un-encrypted secret</param>
        /// <returns>A fully populated ChallengeInfo object ready to be saved</returns>
        public ChallengeInfo Encrypt(byte[] secret)
        {
            //generate a random challenge for use next time
            byte[] challenge = GenerateChallenge();

            //generate the expected HMAC-SHA1 response for the challenge based on the secret
            byte[] resp = GenerateResponse(challenge, secret);

            //use the response to encrypt the secret
            SHA256 sha = SHA256Managed.Create();
            byte[] key = sha.ComputeHash(resp); // get a 256 bit key from the 160 bit hmac response
            byte[] secretHash = sha.ComputeHash(secret);

            StandardAesEngine aes = new StandardAesEngine();
            const uint aesIVLenBytes = 16	;
            byte[] IV = CryptoRandom.Instance.GetRandomBytes(aesIVLenBytes);
            byte[] encrypted;

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = (CryptoStream)aes.EncryptStream(msEncrypt, key, IV))
                {
                    csEncrypt.Write(secret, 0, secret.Length);
                    csEncrypt.Close();
                }

                encrypted = msEncrypt.ToArray();
                msEncrypt.Close();
            }

            ChallengeInfo inf = new ChallengeInfo (encrypted, IV, challenge, secretHash, LT64);

            sha.Clear();

            return inf;
        }
Esempio n. 9
0
        private bool DecryptSecret(byte[] yubiResp, ChallengeInfo inf, out byte[] secret)
        {
            secret = new byte[keyLenBytes];

            if (inf.IV == null) return false;
            if (inf.Verification == null) return false;

            //use the response to decrypt the secret
            SHA256 sha = SHA256Managed.Create();
            byte[] key = sha.ComputeHash(yubiResp); // get a 256 bit key from the 160 bit hmac response

            StandardAesEngine aes = new StandardAesEngine();

            using (MemoryStream msDecrypt = new MemoryStream(inf.EncryptedSecret))
            {
                using (CryptoStream csDecrypt = (CryptoStream)aes.DecryptStream(msDecrypt, key, inf.IV))
                {
                    csDecrypt.Read(secret, 0, secret.Length);
                    csDecrypt.Close();
                }
                msDecrypt.Close();
            }

            byte[] secretHash = sha.ComputeHash(secret);
            for (int i = 0; i < secretHash.Length; i++)
            {
                if (secretHash[i] != inf.Verification[i])
                {
                    //wrong response
                    Array.Clear(secret, 0, secret.Length);
                    return false;
                }
            }

            //return the secret
            sha.Clear();
            return true;
        }