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); } }
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); } }