Esempio n. 1
0
        private void MenuItemDeleteKey_Click(object sender, EventArgs e)
        {
            var title = "Clean up all tokens";

            try
            {
                if (MessageBox.Show("Are you sure you want clean up all connected tokens?"
                                    , title
                                    , MessageBoxButtons.YesNo
                                    , MessageBoxIcon.Question) != DialogResult.Yes)
                {
                    return;
                }


                var tokenList = Task.Run(async() =>
                {
                    var result = await TokenEngine.GetTokenListAsync();
                    foreach (var t in result)
                    {
                        await t.LoadAsync();
                        if (!t.Capability.IsInitialized || !t.Capability.IsObjectAPISupported || t.Capability.IsObjectAPIIsReadOnly)
                        {
                            continue;
                        }
                    }
                    return(result.Where(t => t.Capability.IsInitialized || t.Capability.IsObjectAPISupported || !t.Capability.IsObjectAPIIsReadOnly).ToList());
                }).Result;

                if (tokenList.Count == 0)
                {
                    if (MessageBox.Show("No token was found. Please connect a token."
                                        , title
                                        , MessageBoxButtons.OK
                                        , MessageBoxIcon.Question) != DialogResult.Yes)
                    {
                        return;
                    }
                }

                var errorMessage = Task.Run(async() =>
                {
                    foreach (var token in tokenList)
                    {
                        try
                        {
                            var objs = await token.FindObjectsAsync(isPrivate: true);
                            await Task.WhenAll(objs.Select(async x => await x.DeleteAsync()));
                        }
                        catch (Exception ex)
                        {
                            return(ex.Message);
                        }
                    }

                    return(string.Empty);
                }).Result;

                if (!string.IsNullOrEmpty(errorMessage))
                {
                    throw new Exception(errorMessage);
                }

                MessageBox.Show($"All connected tokens have been cleaned up."
                                , title
                                , MessageBoxButtons.OK
                                , MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                var exception = ex;
                if (ex.InnerException != null)
                {
                    exception = ex.InnerException;
                }
                MessageBox.Show($"An error occurred:{Environment.NewLine}{exception.Message}"
                                , title
                                , MessageBoxButtons.OK
                                , MessageBoxIcon.Error);
            }
        }
Esempio n. 2
0
        private void MenuItemCopyKey_Click(object sender, EventArgs e)
        {
            var title = "Copy Last Key";

            try
            {
                var result = MessageBox.Show("Are you sure you want to copy the last key used to the current token?"
                                             , title
                                             , MessageBoxButtons.YesNo
                                             , MessageBoxIcon.Question);

                if (result != DialogResult.Yes)
                {
                    return;
                }

                if (symKeyProvider.ProtectedLastProvidedKey == null)
                {
                    throw new Exception("No key has been used yet. Use a token to log in and try again.");
                }

                var token = Task.Run(async() =>
                {
                    foreach (var t in await TokenEngine.GetTokenListAsync())
                    {
                        await t.LoadAsync();
                        if (!t.Capability.IsInitialized || !t.Capability.IsObjectAPISupported || t.Capability.IsObjectAPIIsReadOnly)
                        {
                            continue;
                        }

                        return(t);
                    }
                    return(null);
                }).Result;

                if (token == null)
                {
                    throw new Exception("No suitable token was found.");
                }

                var errorMessage = Task.Run(async() =>
                {
                    var dataObject = (await token.FindObjectsAsync(SymmetricKeyProvider.DataObjectLabel, isPrivate: true))
                                     .FirstOrDefault();

                    if (dataObject != null)
                    {
                        return("There is already a key on the token.");
                    }

                    var key = new byte[symKeyProvider.ProtectedLastProvidedKey.Length];

                    try
                    {
                        Array.Copy(symKeyProvider.ProtectedLastProvidedKey, key, symKeyProvider.ProtectedLastProvidedKey.Length);
                        ProtectedMemory.Unprotect(key, MemoryProtectionScope.SameProcess);
                        using (var keyData = new SymmetricKeyData(key))
                        {
                            dataObject = await token.CreateObjectAsync(SymmetricKeyProvider.DataObjectLabel, keyData.RawData.Length, isPrivate: true);
                            await dataObject.SetDataAsync(keyData.RawData);
                        }
                    }
                    catch
                    {
                        try
                        {
                            await dataObject.DeleteAsync();
                        }
                        catch { }

                        throw;
                    }
                    finally
                    {
                        Array.Clear(key, 0, key.Length);
                    }

                    return(string.Empty);
                }).Result;

                if (!string.IsNullOrEmpty(errorMessage))
                {
                    throw new Exception(errorMessage);
                }

                MessageBox.Show($"The key was successfully copied to another token."
                                , title
                                , MessageBoxButtons.OK
                                , MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                var exception = ex;
                if (ex.InnerException != null)
                {
                    exception = ex.InnerException;
                }
                MessageBox.Show($"An error occurred:{Environment.NewLine}{exception.Message}"
                                , title
                                , MessageBoxButtons.OK
                                , MessageBoxIcon.Error);
            }
        }