public async Task UploadCipherAttachmentFileAsync(AttachmentUploadDataResponse uploadData, EncString encryptedFileName, EncByteArray encryptedFileData) { try { switch (uploadData.FileUploadType) { case FileUploadType.Direct: await _bitwardenFileUploadService.Upload(encryptedFileName.EncryptedString, encryptedFileData, fd => _apiService.PostAttachmentFileAsync(uploadData.CipherResponse.Id, uploadData.AttachmentId, fd)); break; case FileUploadType.Azure: Func <Task <string> > renewalCallback = async() => { var response = await _apiService.RenewAttachmentUploadUrlAsync(uploadData.CipherResponse.Id, uploadData.AttachmentId); return(response.Url); }; await _azureFileUploadService.Upload(uploadData.Url, encryptedFileData, renewalCallback); break; default: throw new Exception($"Unkown file upload type: {uploadData.FileUploadType}"); } } catch { await _apiService.DeleteCipherAttachmentAsync(uploadData.CipherResponse.Id, uploadData.AttachmentId); throw; } }
public async Task UploadSendFileAsync(SendFileUploadDataResponse uploadData, EncString fileName, EncByteArray encryptedFileData) { try { switch (uploadData.FileUploadType) { case FileUploadType.Direct: await _bitwardenFileUploadService.Upload(fileName.EncryptedString, encryptedFileData, fd => _apiService.PostSendFileAsync(uploadData.SendResponse.Id, uploadData.SendResponse.File.Id, fd)); break; case FileUploadType.Azure: Func <Task <string> > renewalCallback = async() => { var response = await _apiService.RenewFileUploadUrlAsync(uploadData.SendResponse.Id, uploadData.SendResponse.File.Id); return(response.Url); }; await _azureFileUploadService.Upload(uploadData.Url, encryptedFileData, renewalCallback); break; default: throw new Exception("Unknown file upload type"); } } catch (Exception) { await _apiService.DeleteSendAsync(uploadData.SendResponse.Id); throw; } }
public async Task <byte[]> DecryptToBytesAsync(EncString encString, SymmetricCryptoKey key = null) { var iv = Convert.FromBase64String(encString.Iv); var data = Convert.FromBase64String(encString.Data); var mac = !string.IsNullOrWhiteSpace(encString.Mac) ? Convert.FromBase64String(encString.Mac) : null; return(await AesDecryptToBytesAsync(encString.EncryptionType, data, iv, mac, key)); }
public static void WL_EncString(int amount) { EncString stringVar = RandomString(); int currentPos = 0; int timesIncremented = 0; while (timesIncremented < amount) { timesIncremented++; stringVar = StringReplaceAt(stringVar, currentPos, RandomCharNormal()); currentPos++; if (currentPos >= stringVar.Length) { currentPos = 0; } } }
public async Task SaveWithServerAsync_PrefersFileUploadService(SutProvider <CipherService> sutProvider, Cipher cipher, string fileName, EncByteArray data, AttachmentUploadDataResponse uploadDataResponse, EncString encKey) { var encFileName = new EncString(fileName); sutProvider.GetDependency <ICryptoService>().EncryptAsync(fileName, Arg.Any <SymmetricCryptoKey>()) .Returns(encFileName); sutProvider.GetDependency <ICryptoService>().EncryptToBytesAsync(data.Buffer, Arg.Any <SymmetricCryptoKey>()) .Returns(data); sutProvider.GetDependency <ICryptoService>().MakeEncKeyAsync(Arg.Any <SymmetricCryptoKey>()).Returns(new Tuple <SymmetricCryptoKey, EncString>(null, encKey)); sutProvider.GetDependency <IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any <AttachmentRequest>()) .Returns(uploadDataResponse); await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer); await sutProvider.GetDependency <IFileUploadService>().Received(1) .UploadCipherAttachmentFileAsync(uploadDataResponse, encFileName, data); }
public async Task <SymmetricCryptoKey> MakeKeyFromPinAsync(string pin, string salt, KdfType kdf, int kdfIterations, EncString protectedKeyCs = null) { if (protectedKeyCs == null) { var pinProtectedKey = await _stateService.GetPinProtectedAsync(); if (pinProtectedKey == null) { throw new Exception("No PIN protected key found."); } protectedKeyCs = new EncString(pinProtectedKey); } var pinKey = await MakePinKeyAysnc(pin, salt, kdf, kdfIterations); var decKey = await DecryptToBytesAsync(protectedKeyCs, pinKey); return(new SymmetricCryptoKey(decKey)); }
private async Task <Tuple <SymmetricCryptoKey, EncString> > BuildEncKeyAsync(SymmetricCryptoKey key, byte[] encKey) { EncString encKeyEnc = null; if (key.Key.Length == 32) { var newKey = await StretchKeyAsync(key); encKeyEnc = await EncryptAsync(encKey, newKey); } else if (key.Key.Length == 64) { encKeyEnc = await EncryptAsync(encKey, key); } else { throw new Exception("Invalid key size."); } return(new Tuple <SymmetricCryptoKey, EncString>(new SymmetricCryptoKey(encKey), encKeyEnc)); }
public async Task <string> DecryptToUtf8Async(EncString encString, SymmetricCryptoKey key = null) { return(await AesDecryptToUtf8Async(encString.EncryptionType, encString.Data, encString.Iv, encString.Mac, key)); }
public Task <SymmetricCryptoKey> GetEncKeyAsync(SymmetricCryptoKey key = null) { if (_encKey != null) { return(Task.FromResult(_encKey)); } if (_getEncKeysTask != null && !_getEncKeysTask.IsCompleted && !_getEncKeysTask.IsFaulted) { return(_getEncKeysTask); } async Task <SymmetricCryptoKey> doTask() { try { var encKey = await _stateService.GetEncKeyEncryptedAsync(); if (encKey == null) { return(null); } if (key == null) { key = await GetKeyAsync(); } if (key == null) { return(null); } byte[] decEncKey = null; var encKeyCipher = new EncString(encKey); if (encKeyCipher.EncryptionType == EncryptionType.AesCbc256_B64) { decEncKey = await DecryptToBytesAsync(encKeyCipher, key); } else if (encKeyCipher.EncryptionType == EncryptionType.AesCbc256_HmacSha256_B64) { var newKey = await StretchKeyAsync(key); decEncKey = await DecryptToBytesAsync(encKeyCipher, newKey); } else { throw new Exception("Unsupported encKey type."); } if (decEncKey == null) { return(null); } _encKey = new SymmetricCryptoKey(decEncKey); return(_encKey); } finally { _getEncKeysTask = null; } } _getEncKeysTask = doTask(); return(_getEncKeysTask); }
public async Task SaveWithServerAsync_ThrowsOnBadRequestApiException(SutProvider <CipherService> sutProvider, Cipher cipher, string fileName, EncByteArray data, EncString encKey) { sutProvider.GetDependency <ICryptoService>().EncryptAsync(fileName, Arg.Any <SymmetricCryptoKey>()) .Returns(new EncString(fileName)); sutProvider.GetDependency <ICryptoService>().EncryptToBytesAsync(data.Buffer, Arg.Any <SymmetricCryptoKey>()) .Returns(data); sutProvider.GetDependency <ICryptoService>().MakeEncKeyAsync(Arg.Any <SymmetricCryptoKey>()) .Returns(new Tuple <SymmetricCryptoKey, EncString>(null, encKey)); var expectedException = new ApiException(new ErrorResponse { StatusCode = HttpStatusCode.BadRequest }); sutProvider.GetDependency <IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any <AttachmentRequest>()) .Throws(expectedException); var actualException = await Assert.ThrowsAsync <ApiException>(async() => await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer)); Assert.Equal(expectedException.Error.StatusCode, actualException.Error.StatusCode); }
public async Task SaveWithServerAsync_FallsBackToLegacyFormData(HttpStatusCode statusCode, SutProvider <CipherService> sutProvider, Cipher cipher, string fileName, EncByteArray data, CipherResponse response, EncString encKey) { sutProvider.GetDependency <ICryptoService>().EncryptAsync(fileName, Arg.Any <SymmetricCryptoKey>()) .Returns(new EncString(fileName)); sutProvider.GetDependency <ICryptoService>().EncryptToBytesAsync(data.Buffer, Arg.Any <SymmetricCryptoKey>()) .Returns(data); sutProvider.GetDependency <ICryptoService>().MakeEncKeyAsync(Arg.Any <SymmetricCryptoKey>()).Returns(new Tuple <SymmetricCryptoKey, EncString>(null, encKey)); sutProvider.GetDependency <IApiService>().PostCipherAttachmentAsync(cipher.Id, Arg.Any <AttachmentRequest>()) .Throws(new ApiException(new ErrorResponse { StatusCode = statusCode })); sutProvider.GetDependency <IApiService>().PostCipherAttachmentLegacyAsync(cipher.Id, Arg.Any <MultipartFormDataContent>()) .Returns(response); await sutProvider.Sut.SaveAttachmentRawWithServerAsync(cipher, fileName, data.Buffer); await sutProvider.GetDependency <IApiService>().Received(1) .PostCipherAttachmentLegacyAsync(cipher.Id, Arg.Any <MultipartFormDataContent>()); }