Шифрование файлов для облака в cryptomator

Содержание:

Пара заметок на полях

Не смог найти никакого описания API Облака, пришлось выдёргивать из смежных статей и проектов. Но надо отдать должное Mail.Ru — даже при работе в 25 потоков и сотнях запросов getattr/read/write в секунду только изредка проскакивает 500 Internal Server error в ответ. Я не так часто его вижу, но если эту статью читает кто-то из команды Облака и нужны детали — я могу вытащить несколько таких репортов.

libfuse при написании файловой системы, да и вообще сама архитектура FUSE по своему концепту напомнила о userspace client-server drivers, например в или в . Приятно видеть, что интересные идеи, которые были заброшены с потерей актуальности этих систем, получили новую жизнь.

Многопоточность для ФС пришлось придумывать с нуля и на коленке, так что это был интересный вызов. Нет чёткой уверенности, что всё получилось в лучшем виде (и без багов), но это работает — и работает довольно быстро. Разве что есть сомнения по поводу того, как само Облако отнесётся к одновременной заливке и скачиванию файлов.

Следует предупредить, что я не тестировал подробно MARC-FS на Mac OS X. Мы с другом добились стабильной сборки и пару раз покопировали музыку в терминале, но не более. У меня нет Apple-железа под рукой и я не могу эффективно протестировать работу ФС, так что если кто-то сможет поддержать работу ФС на этой платформе, буду рад.

Data Privacy+ with Zero Knowledge – Full Control Over Your Data

Boxcryptor is a zero knowledge provider. Any private and sensitive information will always be in encrypted form, protected by the user’s password – which we do not know and have no way of finding out. Only public keys are in plain text.

Passwords, password keys and file keys never leave the users’ devices and are never transferred anywhere or to anyone. User keys, group keys, and company keys are stored on the Boxcryptor server, but in encrypted form. All encryption operations take place on your device – never on our servers.

The starting point for every decryption process is the user’s password key as this one is required to unlock the private key and the wrapping key, which again are required to unlock all other keys in the system (AES keys, file keys, membership keys, group keys, etc.). The password key, however, never leaves the user’s device. Even though the Boxcryptor server stores keys for all users, Boxcryptor is a zero knowledge provider, because the sensitive keys are already received in encrypted form.

The only types of keys stored in plaintext on the Boxcryptor server are public keys, which do not contain any sensitive information and, as these are public, do not need to be kept confidential.

Common Service Locator by Microsoft

Microsoft Public License (Ms-PL)

This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.

  1. Definitions

    The terms «reproduce,» «reproduction,» «derivative works,» and «distribution» have the same meaning here as under U.S. copyright law.

    A «contribution» is the original software, or any additions or changes to the software.

    A «contributor» is any person that distributes its contribution under this license.

    «Licensed patents» are a contributor’s patent claims that read directly on its contribution.

  2. Grant of Rights

    (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.

    (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.

  3. Conditions and Limitations

    (A) No Trademark License- This license does not grant you rights to use any contributors’ name, logo, or trademarks.

    (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.

    (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.

    (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.

    (E) The software is licensed «as-is.» You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.

Boxcryptor Settings

To access the Boxcryptor settings, right-click on the Boxcryptor icon located in the system tray and select Settings. Navigate to the Advanced tab to change the name of the Boxcryptor drive, its drive letter, autostart- and update settings, as well as filename encryption defaults.

The default settings are:

  • Start with Windows
  • Check for updates
  • Hide files and folders starting with a dot

Additionally, you can make the following changes to the Boxcryptor settings:

Changing these settings may cause unwanted behavior of Boxcryptor. Please do not change these unless you are an experienced user.

  • Enable recycle bin: Deleting files will move them to trash, so that they can be restored if necessary.
  • Mount as fixed drive: Even though the Boxcryptor drive is a virtual drive, this option will make it look and treated as a real drive.
  • Mount for all users: System accounts will be able to access Boxcryptor.
  • Enable long path support (Windows 7, 8, 8.1 only): Enables working with paths longer than 256 characters. Careful: This might cause problems and errors with many other applications.

Boxcryptor inherits the system-wide Enable win32 long paths setting shipped with Windows 10. Click here to learn how to enable it.

  • Mount in Windows Mount Manager: Adds the Boxcryptor drive to the Windows Mount Manager.
  • Hide files and folders starting with a dot: Those files are generally meant to be hidden. This is enforced by this option.
  • Hide files and folders with names that cannot be decrypted: If you cannot decrypt the names of the files and folders, you do not have access to them. Therefore, we hide them.
  • Hide OneDrive online file warning: Boxcryptor cannot handle OneDrive’s “on-demand” files. Enable this option to prevent warning messages from Boxcryptor when browsing folders with such files.
  • Auto detect removable drives: Automatically mount USB sticks or external storages as Boxcryptor locations.
  • Auto detect network drives: Automatically mount network drives as Boxcryptor locations.

Activating Mount in Windows Mount Manager and Mount for all users allows Cortana and Windows Search to browse Boxcryptor files. Check here how to add the Boxcryptor drive to the Windows Search Index.
Warning: Adding the Boxcryptor drive to the Windows Search Index can result in severe CPU load and performance degradation as Windows is indexing all files in the Boxcryptor drive. Additionally, normally encrypted contents may end up in the unencrypted Windows Search Index.

How File Access Sharing Works

Which processes does Boxcryptor perform, when you allow a colleague to access a file or folder? What happenes, when you share access with a group where your colleague is a member? Imagine your name is Alice and your colleague is called Bob.

Sharing File Access With One Person

  1. Alice requests Bob’s public key from the Boxcryptor Key Server.
  2. Alice encrypts the file key with Bob’s public key.
  3. Alice writes the new encrypted file key to the encrypted file.
  4. The cloud storage provider syncs the modified encrypted file.
  5. Bob uses his private key to decrypt the file key.
  6. Bob uses the file key to decrypt the file.

Sharing File Access With a Group

  1. Alice requests the group’s public key from the Boxcryptor server.
  2. Alice encrypts the file key with the group’s public key.
  3. Alice writes the new encrypted file key to the encrypted file.
  4. The cloud storage provider syncs the modified encrypted file.
  5. Bob uses his private key to decrypt the group’s membership key.
  6. Bob uses the group’s membership key to decrypt the group’s private key.
  7. Bob uses the group’s private key to decrypt the file key.
  8. Bob uses the file key to decrypt the file.

How the User is Authenticated

When a user creates a Boxcryptor account, Boxcryptor derives the password hash from the user’s password. This password hash is used for all subsequent authentication operations. Only a hash of the password hash is stored on the Boxcryptor server — the password hash itself is never stored. See below, how it works in detail.

A User Creates a Boxcryptor Account

  1. A random, 24 byte password hash salt and with it the password hash is derived from the password.
  2. The password hash (and not the password itself) is sent to the Boxcryptor server, together with the password hash salt
  3. On the server, the password hash is hashed again, using PBKDF2 with HMACSHA512, 10.000 iterations and the user’s random 24 byte salt.
  4. On the server, this hashed password hash is then stored in encrypted form in the database.

A User Logs in and Authenticates Himself

  1. The password hash is derived from the provided password.
  2. The email address and password hash are sent to the Boxcryptor server
  3. On the server, the password hash is hashed using PBKDF2 with HMACSHA512, 10.000 iterations and the user’s random 24 byte salt.
  4. On the server, this hashed password hash is compared with the value stored in the database. If it matches, the user provided the correct password and is successfully authenticated. If not, the password was wrong.

Note: This process is only required to authenticate the user against the Boxcryptor server — not to get access to the encrypted files. Access to the encrypted files always relies on the correct decryption of the user’s private key which requires the knowledge of the correct password. Even if an attacker would be able to fake authentication – for example by hacking the Boxcryptor server – he would not be able to decrypt a single file without knowing the correct password, which is only known by the user himself.

Data Privacy+ with Zero Knowledge – Full Control Over Your Data

Boxcryptor is a zero knowledge provider. Any private and sensitive information will always be in encrypted form, protected by the user’s password – which we do not know and have no way of finding out. Only public keys are in plain text.

Passwords, password keys and file keys never leave the users’ devices and are never transferred anywhere or to anyone. User keys, group keys, and company keys are stored on the Boxcryptor server, but in encrypted form. All encryption operations take place on your device – never on our servers.

The starting point for every decryption process is the user’s password key as this one is required to unlock the private key and the wrapping key, which again are required to unlock all other keys in the system (AES keys, file keys, membership keys, group keys, etc.). The password key, however, never leaves the user’s device. Even though the Boxcryptor server stores keys for all users, Boxcryptor is a zero knowledge provider, because the sensitive keys are already received in encrypted form.

The only types of keys stored in plaintext on the Boxcryptor server are public keys, which do not contain any sensitive information and, as these are public, do not need to be kept confidential.

Использование Boxcryptor

Установка Boxcryptor

Перед установкой программы желательно, чтобы клиент облачного хранилища (Dropbox, Google Drive и т.п.) уже был установлен. В таком случае Boxcryptor автоматически определит и подключит папку с данными в облаке.

Установка Boxcryptor ничем не отличается от установки обычной программы. В процессе установки нужно будет выбрать галочку перезагрузки системы по завершении инсталляции программы, иначе установщик выдаст ошибку.

Также нужно будет разрешить установку драйвера виртуального устройства.

Настройка Boxcryptor

После установки программы и перезагрузки Вы увидите следующее окно.

Boxcryptor позволяет создавать как удаленный так и локальный аккаунт. Во втором случае безопасность будет еще выше, так как ключ не передается по сети, но за его хранение отвечаете только Вы и в случае его утери данные не будут подлежать восстановлению.

Для создания локального аккаунта нужно нажать на троеточие (картинка выше). Затем в поле «Local account» нужно нажать «Setup account».

Ставим галочку, подтверждая таким образом ответственность за хранение файла ключа доступа и нажимаем кнопку «Create key file».

В следующем окне придумываем пароль и ставим галочки о соглашении с условиями использования и политикой конфиденциальности.

Снова соглашаемся с пониманием того, что ответственность за хранения пароля лежит на нас.

В следующем окне будут показаны данные локальной учетной записи. Нажмите кнопку «Next», подтверждая таким образом эти данные.

В следующем окне нужно выбрать тарифный план. Нажмите на «Free», затем на кнопку «Next».

Последнее окно приветствия укажет на успешное создание аккаунта. Нажмите «ОК» и Вы увидите форму входа в локальный аккаунт. Введите придуманный ранее пароль, чтобы войти в него.

Должно появиться руководство использования — «Tutorial» (можете сразу же закрыть его) и окно проводника Windows с уже подключенным облачным хранилищем (Dropbox в моем случае).

В окне проводника кроме логических дисков, еще можно увидеть виртуальный диск, в котором находится папка, ссылающаяся на папку в облачном хранилище.

Чтобы зашифровать файл, кликните по нему правой кнопкой мыши и выберите команду «Boxcryptor > Encrypt».

После шифрования в папке виртуального диска Boxcryptor с файлом можно работать как обычно. Но в каталоге хранилища и на сервере он будет зашифрованный.

Также при попытке добавить файлы в хранилище, будет всплывать запрос на их шифрование.

Если у Вас установлено несколько клиентов облачных хранилищ, управление ими осуществляется в настройках (иконка Boxcryptor’а в трее Windows > Settings) на вкладке «Locations».

Local Account

Users that are required to keep physical control over their user information and keys can choose to use Boxcryptor with a local account instead of a Boxcryptor account stored at the Boxcryptor Key Server. When using a local account, all user information and key data is stored in a key file on the local device instead of being transmitted to the Boxcryptor Key Server. Local accounts can be converted to Boxcryptor accounts (and vice versa) at any time.

Important:
Sharing access to files and folders is not available when using a local account because it requires Boxcryptor accounts and access to the Key Server. Additionally, it is the user’s responsibility to take care of the key file — copying it to other devices, creating backups, etc. If the key file is lost, access to all encrypted files will be lost! (Tip: As the sensitive information in the key file (e.g. private keys) is encrypted, users can store the key file in their cloud storage.)

Bouncy Castle Crypto APIs by Various

LICENSE
Copyright (c) 2000 — 2012 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Идея

Поэтому был придуман честолюбивый план — написать FUSE-файловую систему для Облака, а уже поверх неё смонтировать EncFS (для лучшей безопасности стоит сгенерить ключ GPG и использовать ecryptfs, т.к. современные компьютерные мощности уже позволяют взломать EncFS). В некотором роде это будет похоже на то, как пользуясь облаком MEGA мы перетаскиваем файл в окошко браузера — применяется Е2Е-шифрование и файл отправляется в облако, ничего не занимая локально. Назвать было решено «MARC-FS» — MAail.Ru Cloud FileSystem. С её помощью мы уходим от указанной проблемы локального хранения зашифрованных данных — копируя данные в каталог EncFS мы будем точно так же автоматически шифровать их и отправлять в облако. На самом деле уровнем пониже мы будем вызывать довольно длинную цепочку преобразований вида cp -> kernel FUSE module -> userspace libfuse hook -> EncFS -> FUSE kernel -> libfuse hook ->MARC-FS -> kernel network stack, но упрощённая схема работы будет выглядеть примерно так:

Ookii.Dialogs by Sven Groot

License agreement for Ookii.Dialogs.

Copyright Sven Groot (Ookii.org) 2009
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1) Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2) Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3) Neither the name of the ORGANIZATION nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS «AS IS»
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.

Хранитель ключей шифрования

Чтобы расшифровать зашифрованные данные, нужен ключ. Каждый раз, когда данные шифруются, один из этих ключей создается и где-то сохраняется. Многие онлайн-сервисы резервного копирования, которые отделены от сервисов облачной синхронизации, позволяют вам создать ключ шифрования и взять на себя ответственность за его безопасность. Если вы потеряете ключ, попрощайтесь со своими зарезервированными данными.

Службы облачного хранилища, используемые для синхронизации и совместного использования, такие как Dropbox, не предоставляют пользователям возможность создавать свои собственные ключи шифрования. Пользователь должен доверить сервису создание и защиту ключа. Меньше шансов, что вы навсегда потеряете доступ к собственным файлам, но также есть вероятность того, что сама служба будет взломана, и в этом случае всё окажется в руках злоумышленников.

Итог: независимо от того, насколько вы осторожны, всё может пойти не так, когда кто-то другой хранит ключи шифрование.

How File Access Sharing Works

Which processes does Boxcryptor perform, when you allow a colleague to access a file or folder? What happenes, when you share access with a group where your colleague is a member? Imagine your name is Alice and your colleague is called Bob.

Sharing File Access With One Person

  1. Alice requests Bob’s public key from the Boxcryptor Key Server.
  2. Alice encrypts the file key with Bob’s public key.
  3. Alice writes the new encrypted file key to the encrypted file.
  4. The cloud storage provider syncs the modified encrypted file.
  5. Bob uses his private key to decrypt the file key.
  6. Bob uses the file key to decrypt the file.

Sharing File Access With a Group

  1. Alice requests the group’s public key from the Boxcryptor server.
  2. Alice encrypts the file key with the group’s public key.
  3. Alice writes the new encrypted file key to the encrypted file.
  4. The cloud storage provider syncs the modified encrypted file.
  5. Bob uses his private key to decrypt the group’s membership key.
  6. Bob uses the group’s membership key to decrypt the group’s private key.
  7. Bob uses the group’s private key to decrypt the file key.
  8. Bob uses the file key to decrypt the file.

Boxcryptor Server – What User Data we Store

All data that we store on our servers is secured and protected. In order to provide a seamless user experience over a number of different devices and with core features such as file access sharing, Boxcryptor needs to store some data on the Boxcryptor server.

General User Data That We Store

We store a small amount of information of each user, group and company. The information is necessary to authenticate you as a user at sign in.

  • Email address
  • First and last name
  • Country
  • Etc.

Keys and Additional Values

Additionally, we store keys and values that are necessary for encrypting and decrypting processes. Of course, these values are protected carefully as well.

  • Private RSA key (encrypted with the user’s password)
  • Public RSA key
  • AES keys (encrypted with the user’s password / wrapping key)
  • Hash of the password hash
  • Number of KDF iterations used in the key and password hash derivation functions
  • Salt (used to salt the password key and the password hash server side)
  • Password hash salt
  • If a company uses the Master Key: Password Key (encrypted with the company’s public RSA key)

Data We Store When You Are Part of a Group

If you are a member or owner of a group, some more keys are created that we store on our servers as well.

  • Private RSA key (encrypted with the membership key)
  • Public RSA key
  • AES keys (encrypted with the membership key / wrapping key)
  • Membership key (encrypted with every member’s public RSA key)
  • Membership key (optional — AES encrypted with every member’s group key)

Data We Store if You Are Part of a Boxcryptor Company Team

When you are using the Boxcryptor Company, this additional data is stored on our servers.

  • Private RSA key (encrypted with the company administration password)
  • Public RSA key
  • List of users
  • Policies that have been activated by your company

Windows

После неприятной истории с системой авторизации Dropbox предприимчивые немецкие ребята оперативно зарелизили утилиту BoxCryptor (www.boxcryptor.com), которая создает в системе виртуальный криптографический диск. Каждый помещенный на него файл автоматически шифруется с использованием стандарта AES-256.

Физически зашифрованные данные размещаются в произвольной директории, например, в папке Dropbox, в то время как на виртуальном диске они находятся в открытом виде, и к ним без проблем можно обратиться из любого приложения. Разработчики поступили очень мудро и не стали изобретать велосипед, а просто реализовали основные возможности EncFS для использования под Windows. И пусть BoxCryptor поддерживает пока не все возможности технологии, но этого вполне достаточно для надежной защиты данных.

Приложение после установки автоматически определяет папку, используемую Dropbox’ом, и предлагает разместить в ней директорию с зашифрованными файлами. Для шифрования данных тебе необходимо придумать парольную фразу, а также выбрать букву для диска, на котором будут располагаться файлы в открытом виде. Если ты не хочешь, чтобы данные без твоего ведома находились в открытом виде, пароль можно не сохранять и вводить его каждый раз, когда ты будешь монтировать диск. Поставив галку напротив «Advanced Mode», ты получишь доступ к некоторым тонким настройкам BoxCryptor. Это в частности может потребоваться, если есть необходимость использовать возможность Dropbox’а для отката к предыдущей версии файла.

Дело в том, что BoxCryptor по умолчанию шифрует и имена файлов, превращая их в абракадабру, тем самым мешая работе системы версионности, которая реализована в Dropbox. Поэтому если такая возможность тебе нужна, то шифрование имен файлов придется отключить.

С этого момента ты должен увидеть директорию BoxCryptor внутри своего Dropbox’а, а в системе должен появиться виртуальный диск (у меня — X:). Теперь у тебя в Dropbox’е есть папка, где ты можешь хранить конфиденциальные файлы

Тут важно запомнить два важных правила. Первое — никогда не сохраняй файлы напрямую в директорию BoxCryptor, это место, где данные хранятся в зашифрованном виде (и в таком же виде синхронизируются с облаком)

Поэтому работать с документами надо через тот самый виртуальный диск. И второе — никогда не удаляй из папки BoxCryptor файл encfs6.xml. В нем находится важная для EncFS информация, которая необходима для того, чтобы дешифровать данные. В бесплатной версии программы можно создать логический раздел, объемом не более двух гигабайт, то есть ровно такого же раздела, сколько по умолчанию предоставляет Dropbox. На случай, если тебя это ограничение не устраивает, и деньги платить не хочется, есть открытая реализация EncFS для Windows — encfs4win (gitorious.org/encfs4win). В ней, само собой, никаких ограничений нет.

В основе, как и в случае с BoxCryptor, лежит библиотека Dokan (dokandev.net), которая является аналогом FUSE под Windows и необходима для монтирования в системе сторонних файловых систем.

Local Account

Users that are required to keep physical control over their user information and keys can choose to use Boxcryptor with a local account instead of a Boxcryptor account stored at the Boxcryptor Key Server. When using a local account, all user information and key data is stored in a key file on the local device instead of being transmitted to the Boxcryptor Key Server. Local accounts can be converted to Boxcryptor accounts (and vice versa) at any time.

Important:
Sharing access to files and folders is not available when using a local account because it requires Boxcryptor accounts and access to the Key Server. Additionally, it is the user’s responsibility to take care of the key file — copying it to other devices, creating backups, etc. If the key file is lost, access to all encrypted files will be lost! (Tip: As the sensitive information in the key file (e.g. private keys) is encrypted, users can store the key file in their cloud storage.)

CefSharp by The CefSharp Authors

Copyright 2010-2017 The CefSharp Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

  • Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following disclaimer
    in the documentation and/or other materials provided with the
    distribution.
  • Neither the name of Google Inc. nor the name Chromium Embedded
    Framework nor the name CefSharp nor the names of its contributors
    may be used to endorse or promote products derived from this software
    without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
«AS IS» AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *