public void StreamEncryptionEncryptBadNonce()
 {
     StreamEncryption.Encrypt(
         Encoding.UTF8.GetBytes("Adam Caudill"),
         Encoding.UTF8.GetBytes("ABCDEFGHIJKLMNOPQRSTUVW"),
         Encoding.UTF8.GetBytes("12345678901234567890123456789012"));
 }
        public void XSalsa20Test()
        {
            var    key     = StreamEncryption.GenerateKey();
            var    nonce   = StreamEncryption.GenerateNonce();
            string message = "Hello, World!";

            var cipherText = StreamEncryption.Encrypt(message, nonce, key);
            var decrypted  = StreamEncryption.Decrypt(cipherText, nonce, key);

            Assert.AreEqual(message, System.Text.Encoding.UTF8.GetString(decrypted));

            byte[] byteMessage = System.Text.Encoding.UTF8.GetBytes(message);
            cipherText = StreamEncryption.Encrypt(byteMessage, nonce, key);
            decrypted  = StreamEncryption.Decrypt(cipherText, nonce, key);
            Assert.AreEqual(Convert.ToBase64String(byteMessage), Convert.ToBase64String(decrypted));

            cipherText = StreamEncryption.EncryptXSalsa20(message, nonce, key);
            decrypted  = StreamEncryption.DecryptXSalsa20(cipherText, nonce, key);
            Assert.AreEqual(message, System.Text.Encoding.UTF8.GetString(decrypted));

            byteMessage = System.Text.Encoding.UTF8.GetBytes(message);
            cipherText  = StreamEncryption.EncryptXSalsa20(byteMessage, nonce, key);
            decrypted   = StreamEncryption.DecryptXSalsa20(cipherText, nonce, key);
            Assert.AreEqual(Convert.ToBase64String(byteMessage), Convert.ToBase64String(decrypted));
        }
예제 #3
0
        /// <summary>
        /// Creates a QuickPass from the given <paramref name="password"/> and
        /// <paramref name="imk"/> using the QuickPass settings stored in
        /// <paramref name="identity"/>, stores it in memory and establishes a
        /// timer that will clear the QuickPass after the timeout set forth in
        /// <paramref name="identity"/>'s QuickPass settings.
        /// </summary>
        /// <param name="password">The full identity master password.</param>
        /// <param name="imk">The identity's unencrypted Identity Master Key (IMK).</param>
        /// <param name="ilk">The identity's unencrypted Identity Lock Key (ILK).</param>
        /// <param name="identity">The identity that the QuickPass should be set for.</param>
        /// <param name="progress">An object implementing the IProgress interface for tracking the operation's progress (optional).</param>
        /// <param name="progressText">A string representing a text descrition for the progress indicator (optional).</param>
        public async void SetQuickPass(string password, byte[] imk, byte[] ilk, SQRLIdentity identity, IProgress <KeyValuePair <int, string> > progress = null, string progressText = null)
        {
            if (string.IsNullOrEmpty(password))
            {
                Log.Warning("Can't use QuickPass on an empty password, aborting SetQuickPass()!");
                return;
            }

            QuickPassItem qpi = new QuickPassItem()
            {
                EstablishedDate               = DateTime.Now,
                QuickPassLength               = identity.Block1.HintLength,
                IdentityUniqueId              = identity.Block0.UniqueIdentifier.ToHex(),
                ScryptRandomSalt              = SodiumCore.GetRandomBytes(16),
                Nonce                         = SodiumCore.GetRandomBytes(24),
                QuickPassTimeoutSecs          = identity.Block1.PwdTimeoutMins * 60,
                ClearQuickPassOnIdle          = identity.Block1.OptionFlags.ClearQuickPassOnIdle,
                ClearQuickPassOnSleep         = identity.Block1.OptionFlags.ClearQuickPassOnSleep,
                ClearQuickPassOnSwitchingUser = identity.Block1.OptionFlags.ClearQuickPassOnSwitchingUser,
                Timer                         = new Timer()
            };

            qpi.Timer.Enabled   = false;
            qpi.Timer.AutoReset = false; // Dont restart timer after calling elapsed
            qpi.Timer.Interval  = QP_GENERAL_TIMEOUT_SEC;
            qpi.Timer.Elapsed  += QuickPassTimerElapsed;

            string quickPass = password.Substring(0, qpi.QuickPassLength);

            var enScryptResult = await SQRL.EnScryptTime(
                quickPass,
                qpi.ScryptRandomSalt,
                (int)Math.Pow(2, 9),
                QP_KEYDERIV_SEC,
                progress,
                progressText);

            qpi.ScryptIterationCount = enScryptResult.IterationCount;
            qpi.EncryptedImk         = StreamEncryption.Encrypt(imk, qpi.Nonce, enScryptResult.Key);
            qpi.EncryptedIlk         = StreamEncryption.Encrypt(ilk, qpi.Nonce, enScryptResult.Key);

            // If we already have a QuickPass entry for this identity, remove it first
            if (HasQuickPass(qpi.IdentityUniqueId))
            {
                ClearQuickPass(qpi.IdentityUniqueId, QuickPassClearReason.Unspecified);
            }

            // Now, add the QuickPass item to our list and start the timer
            lock (_dataSyncObj)
            {
                _quickPassItems.Add(qpi.IdentityUniqueId, qpi);
                qpi.Timer.Start();
            }

            Log.Information("QuickPass set for identity {IdentityUniqueId}",
                            qpi.IdentityUniqueId);
        }
 public void CreateSecretBox()
 {
     var expected = Utilities.HexToBinary("c7b7f04c00e14b02dd56c78c");
     var actual = StreamEncryption.Encrypt(
       Encoding.UTF8.GetBytes("Adam Caudill"),
       Encoding.UTF8.GetBytes("ABCDEFGHIJKLMNOPQRSTUVWX"),
       Encoding.UTF8.GetBytes("12345678901234567890123456789012"));
     Assert.AreEqual(expected, actual);
 }
 public void StreamEncryptionEncryptBadNonce()
 {
     Assert.Throws <NonceOutOfRangeException>(() =>
     {
         StreamEncryption.Encrypt(
             Encoding.UTF8.GetBytes("Adam Caudill"),
             Encoding.UTF8.GetBytes("ABCDEFGHIJKLMNOPQRSTUVW"),
             Encoding.UTF8.GetBytes("12345678901234567890123456789012"));
     });
 }
예제 #6
0
 private static byte[] EncryptFileBytes(byte[] fileBytes, byte[] nonce, byte[] key)
 {
     byte[] encryptedBytes = new byte[fileBytes.Length];
     if (Globals.EncryptionAlgorithm == (int)Cipher.XChaCha20)
     {
         encryptedBytes = StreamEncryption.EncryptXChaCha20(fileBytes, nonce, key);
     }
     else if (Globals.EncryptionAlgorithm == (int)Cipher.XSalsa20)
     {
         encryptedBytes = StreamEncryption.Encrypt(fileBytes, nonce, key);
     }
     return(encryptedBytes);
 }
        public void XSalsa20SodiumTest()
        {
            var firstkey = new byte[]
            {
                0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,
                0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,
                0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89
            };

            var nonce = new byte[]
            {
                0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,
                0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,
                0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37
            };

            var m = new byte[]
            {
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0xbe, 0x07, 0x5f, 0xc5,
                0x3c, 0x81, 0xf2, 0xd5, 0xcf, 0x14, 0x13, 0x16, 0xeb, 0xeb, 0x0c, 0x7b,
                0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4, 0x4b, 0x66, 0x84, 0x9b,
                0x64, 0x24, 0x4f, 0xfc, 0xe5, 0xec, 0xba, 0xaf, 0x33, 0xbd, 0x75, 0x1a,
                0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29, 0x6c, 0xdc, 0x3c, 0x01,
                0x23, 0x35, 0x61, 0xf4, 0x1d, 0xb6, 0x6c, 0xce, 0x31, 0x4a, 0xdb, 0x31,
                0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d, 0xce, 0xea, 0x3a, 0x7f,
                0xa1, 0x34, 0x80, 0x57, 0xe2, 0xf6, 0x55, 0x6a, 0xd6, 0xb1, 0x31, 0x8a,
                0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde, 0x04, 0x89, 0x77, 0xeb,
                0x48, 0xf5, 0x9f, 0xfd, 0x49, 0x24, 0xca, 0x1c, 0x60, 0x90, 0x2e, 0x52,
                0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40, 0xe0, 0x82, 0xf9, 0x37,
                0x76, 0x38, 0x48, 0x64, 0x5e, 0x07, 0x05
            };

            var actual = StreamEncryption.Encrypt(m, nonce, firstkey);

            Assert.AreEqual(163, actual.Length);
        }