public List <Message> GetDecryptedMessagesWithPrivateKey(string token, string privateKey) { var db = new CryptAByteContext(); var request = db.Keys.Include("Messages").SingleOrDefault(key => key.KeyToken == token); var crypto = new AsymmetricCryptoProvider(); if (!request.IsReleased) { throw new ArgumentOutOfRangeException("Request is not released"); } var plaintextMessages = new List <Message>(); if (request.Messages != null) { request.Messages.ToList().ForEach(retrievedMessage => { string messageDecryptionKey; var decryptedMessage = crypto.DecryptMessageWithKey(privateKey, retrievedMessage.MessageData, retrievedMessage.EncryptionKey, retrievedMessage.MessageHash, out messageDecryptionKey); retrievedMessage.MessageData = decryptedMessage; retrievedMessage.EncryptionKey = messageDecryptionKey; if (!retrievedMessage.IsFile) { retrievedMessage.MessageData = GzipCompression.Decompress(retrievedMessage.MessageData); } else { // this is a zip file } plaintextMessages.Add(retrievedMessage); }); if (request.DeleteMessagesAfterReading || request.DeleteKeyAfterReading) { if (request.DeleteMessagesAfterReading || request.DeleteKeyAfterReading) { request.Messages.ToList().ForEach(message => db.Messages.Remove(message)); } if (request.DeleteKeyAfterReading) { db.Keys.Remove(request); } db.SaveChanges(); } } return(plaintextMessages); }
public void AddRequest(CryptoKey request) { // TODO: Validate key var db = new CryptAByteContext(); db.Keys.Add(request); db.SaveChanges(); }
private static void AttachDataToKey(string token, string compressedMessage, bool isFile, string encryptionKey = null) { string hash = null; string encryptedPassword; var db = new CryptAByteContext(); var request = db.Keys.SingleOrDefault(key => key.KeyToken == token); string encryptedMessage; if (string.IsNullOrWhiteSpace(encryptionKey)) { var crypto = new AsymmetricCryptoProvider(); encryptedMessage = crypto.EncryptMessageWithKey(compressedMessage, request.PublicKey, out encryptedPassword, out hash); } else { encryptedMessage = compressedMessage; encryptedPassword = encryptionKey; } if (request.Messages == null) { request.Messages = new Collection <Message>(); } request.Messages.Add(new Message() { MessageData = encryptedMessage, EncryptionKey = encryptedPassword, MessageHash = hash, Created = DateTime.Now, IsFile = isFile }); db.SaveChanges(); }
public void DeleteKeyWithPassphrase(string token, string passphrase) { var db = new CryptAByteContext(); var key = db.Keys.Include("Messages").SingleOrDefault(k => k.KeyToken == token); if (key == null) { throw new ArgumentOutOfRangeException("Key for this token not found. Was it already deleted?"); } var crypto = new SymmetricCryptoProvider(); try { var plaintext = crypto.DecryptWithKey(key.PrivateKey, passphrase); } catch (ArgumentException) { throw new ArgumentException("Failed to verify passphrase. A correct passphrase is required to verify the delete request."); } db.Keys.Remove(key); db.SaveChanges(); }