private async Task <MailMessage> EncryptMessageAsync(MailAccountContext account, IEnumerable <PublicKeyModel> keys, string recipient, string content) { var message = CreateMailMessage(account, recipient, content); var mime = await message.ToMimeAsync(); var bytes = Encoding.UTF8.GetBytes(mime); var wrapper = CreateMailMessage(account, recipient, "blubbi"); var publicKey = Convert.ToBase64String(App.Context.KeyContainer.PublicKey); wrapper.Headers.Add(ParanoiaHeaderKeys.PublicKey, publicKey); foreach (var key in keys) { var keyBytes = Convert.FromBase64String(key.Data); var nonceBytes = PublicKeyCrypto.GenerateNonce(); var encryptedBytes = await Task.Factory.StartNew(() => App.Context.KeyContainer.EncryptWithPublicKey(bytes, keyBytes, nonceBytes)); var writer = new BinaryWriter(new MemoryStream()); writer.Write(nonceBytes); writer.Write(encryptedBytes); writer.Flush(); writer.BaseStream.Seek(0, SeekOrigin.Begin); var view = new AlternateView(writer.BaseStream, new ContentType("application/x-setolicious")); wrapper.AlternateViews.Add(view); } return(wrapper); }
public void TestPublicKeyEncrypt() { Sodium.InitNativeLibrary(); var pkc1 = new PublicKeyCrypto(); var pkc2 = new PublicKeyCrypto(); pkc1.Init(); pkc2.Init(); var message = "test"; var nonce = PublicKeyCrypto.GenerateNonce(); var encMessage = pkc1.EncryptWithPublicKey(Encoding.ASCII.GetBytes(message), pkc2.PublicKey, nonce); var decryptedMessage = pkc2.DecryptWithPrivateKey(encMessage, pkc1.PublicKey, nonce); Assert.IsTrue(String.Compare(message, Encoding.ASCII.GetString(decryptedMessage)) == 0); }