Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
    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;
            }
        }
    }
Esempio n. 5
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);
        }
Esempio n. 6
0
        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));
        }
Esempio n. 7
0
        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));
        }
Esempio n. 8
0
 public async Task <string> DecryptToUtf8Async(EncString encString, SymmetricCryptoKey key = null)
 {
     return(await AesDecryptToUtf8Async(encString.EncryptionType, encString.Data,
                                        encString.Iv, encString.Mac, key));
 }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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>());
        }