Re-design of the original CryFS code to work as a library.
Go to file
2021-04-03 23:13:18 -07:00
.circleci Update CircleCI machine to 20.04 2021-04-03 23:13:18 -07:00
.github Create ISSUE_TEMPLATE.md 2018-12-18 21:18:42 -08:00
.travisci Fix Appveyor and Travis CI 2020-07-10 16:23:55 -07:00
cmake-utils Update ranges-v3 to 0.11.0 2021-01-14 20:08:09 -08:00
cpack - Use forward instead of backward slashes for paths on Windows in build system and CI 2018-11-21 21:45:27 -08:00
doc Added an option to create a mountpoint with a missing directory (#354) 2020-07-31 18:08:19 -07:00
src Merge branch 'release/0.10' into develop 2021-02-23 08:26:46 -08:00
test Add XChaCha20-Poly1305 cipher and make it the default 2021-01-14 20:02:06 -08:00
vendor Silence cmake warning in googletest 2021-01-12 22:29:12 -08:00
.clang-tidy Update CI to clang-tidy 9 and fix warnings 2020-07-22 10:32:43 -07:00
.gitignore Add vscode folder to gitignore 2020-07-10 16:54:07 -07:00
.travis.yml Add Release and RelWithDebInfo builds on Travis 2018-09-27 16:31:12 -07:00
appveyor.yml Fix Appveyor and Travis CI 2020-07-10 16:23:55 -07:00
archive.sh archive.sh also creates a highly compressed .xz archive 2017-04-06 00:14:14 +01:00
ChangeLog.txt Update CircleCI machine to 20.04 2021-04-03 23:13:18 -07:00
CMakeLists.txt Update to spdlog 1.8.2 2021-01-14 20:00:19 -08:00
CMakeSettings.json Setup conan and get boost dependency through it 2019-11-05 10:02:54 -05:00
conanfile.py Update ranges-v3 to 0.11.0 2021-01-14 20:08:09 -08:00
LICENSE.txt Build Windows Installer package with CPack and WIX 2018-09-27 04:35:48 +02:00
README.md Update CircleCI machine to 20.04 2021-04-03 23:13:18 -07:00
run-clang-tidy.sh Update CI to clang-tidy 9 and fix warnings 2020-07-22 10:32:43 -07:00
run-iwyu.sh Setup iwyu 2018-10-21 11:46:27 +02:00

CryFS Build Status CircleCI Build status

CryFS encrypts your files, so you can safely store them anywhere. It works well together with cloud services like Dropbox, iCloud, OneDrive and others. See https://www.cryfs.org.

Install latest release

Linux

This only works for Ubuntu 17.04 and later, and Debian Stretch and later. You can also use CryFS on older versions of these distributions by following the Building from source instructions below.

sudo apt install cryfs

OSX

CryFS is distributed via Homebrew and MacPorts.

If you use Homebrew:

brew cask install osxfuse
brew install cryfs

If you use MacPorts (not available for OSX 10.15 at the moment):

port install cryfs

Windows (experimental)

CryFS has experimental Windows support since the 0.10 release series. To install it, do:

  1. Install DokanY
  2. Install Microsoft Visual C++ Redistributable for Visual Studio 2019
  3. Install CryFS

GUI

Theres some GUI applications with CryFS support. You usually have to install the GUI and also CryFS itself for it to work.

Stability / Production readiness

CryFS 0.10 or later is stable for most use cases, but has a couple of known issues that can corrupt your file system. They don't happen in normal day to day use, but can happen if you don't pay attention or aren't aware of them. This is why the version number hasn't reached 1.0 yet.

  • If you kill the CryFS process while it was in the middle of writing data (either intentionally or unintentionally by losing power to your PC), your file system could get corrupted. CryFS does not do journaling. Note that in 0.10.x, read accesses into a CryFS file system can cause writes because file timestamps get updated. So if you're unlucky, your file system could get corrupted if you lose power while you were reading files as well. Read accesses aren't an issue in CryFS 0.11.x anymore, because it mounts the filesystem with noatime by default.
  • The same corruption mentioned above can happen when CryFS is trying to write data but your disk ran out of space, causing the write to fail.
  • CryFS does not currently support concurrent access, i.e. accessing a file system from multiple devices at the same time. CryFS works very well for storing data in a cloud and using it from multiple devices, but you need to make sure that only one CryFS process is active at any point in time, and you also need to make sure that the cloud synchronization client (e.g. Dropbox) finishes its synchronization before you switch devices. There are some ideas on how concurrent access could be supported in future versions, but it's a hard problem to solve. If you do happen to access the file system from multiple devices at the same time, it will likely go well most of the time, but it can corrupt your file system.
  • In addition to the scenarios above that can corrupt your file system, note that there is currently no fsck-like tool for CryFS that could recover your data. Although such a tool is in theory, possible, it hasn't been implemented yet and a corrupted file system will most likely cause a loss of your data.

If the scenarios mentioned above don't apply to you, then you can consider CryFS 0.10.x as stable. The 0.9.x versions are not recommended anymore.

Building from source

Requirements

  • Git (for getting the source code)
  • GCC version >= 7 or Clang >= 7
  • CMake version >= 3.10
  • Conan package manager
  • libcurl4 (including development headers)
  • SSL development libraries (including development headers, e.g. libssl-dev)
  • libFUSE version >= 2.8.6 (including development headers), on Mac OS X instead install osxfuse from https://osxfuse.github.io/
  • Python >= 3.5
  • OpenMP

You can use the following commands to install these requirements

    # Ubuntu
    $ sudo apt install git g++ cmake make libcurl4-openssl-dev libssl-dev libfuse-dev python python3-pip
    $ sudo pip3 install conan

    # Fedora
    $ sudo dnf install git gcc-c++ cmake make libcurl-devel openssl-devel fuse-devel python python3-pip
    $ sudo pip3 install conan

    # Macintosh
    $ brew install cmake openssl libomp
    $ sudo pip3 install conan

Build & Install

  1. Clone repository

    $ git clone https://github.com/cryfs/cryfs.git cryfs
    $ cd cryfs
    
  2. Build

    $ mkdir cmake && cd cmake
    $ cmake ..
    $ make
    
  3. Install

    $ sudo make install
    

You can pass the following variables to the cmake command (using -Dvariablename=value):

  • -DCMAKE_BUILD_TYPE=[Release|Debug]: Whether to run code optimization or add debug symbols. Default: Release
  • -DBUILD_TESTING=[on|off]: Whether to build the test cases (can take a long time). Default: off
  • -DCRYFS_UPDATE_CHECKS=off: Build a CryFS that doesn't check online for updates and security vulnerabilities.

Building on Windows (experimental)

Build with Visual Studio 2019 and pass in the following flags to CMake:

-DDOKAN_PATH=[dokan library location, e.g. "C:\Program Files\Dokan\DokanLibrary-1.2.1"]

If you set these variables correctly in the CMakeSettings.json file, you should be able to open the cryfs source folder with Visual Studio 2019.

Troubleshooting

On most systems, CMake should find the libraries automatically. However, that doesn't always work.

  1. Fuse/Osxfuse library not found

    Pass in the library path with

     cmake .. -DFUSE_LIB_PATH=/path/to/fuse/or/osxfuse
    
  2. Fuse/Osxfuse headers not found

    Pass in the include path with

     cmake .. -DCMAKE_CXX_FLAGS="-I/path/to/fuse/or/osxfuse/headers"
    
  3. Openssl headers not found

    Pass in the include path with

     cmake .. -DCMAKE_C_FLAGS="-I/path/to/openssl/include"
    
  4. OpenMP not found (osx)

    Either build it without OpenMP

     cmake .. -DDISABLE_OPENMP=on
    

    but this will cause slower file system mount times (performance after mounting will be unaffected). If you installed OpenMP with homebrew or macports, it will be autodetected. If that doesn't work for some reason (or you want to use a different installation than the autodetected one), pass in these flags:

     cmake .. -DOpenMP_CXX_FLAGS='-Xpreprocessor -fopenmp -I/path/to/openmp/include' -DOpenMP_CXX_LIB_NAMES=omp -DOpenMP_omp_LIBRARY=/path/to/libomp.dylib
    

Using local dependencies

Starting with CryFS 0.11, Conan is used for dependency management. When you build CryFS, Conan downloads the exact version of each dependency library that was also used for development. All dependencies are linked statically, so there should be no incompatibility with locally installed libraries. This is the recommended way because it has the highest probability of working correctly.

However, some distributions prefer software packages to be built against dependencies dynamically and against locally installed versions of libraries. So if you're building a package for such a distribution, you have the option of doing that, at the cost of potential incompatibilities. If you follow this workflow, please make sure to extensively test your build of CryFS. You're using a setup that wasn't tested by the CryFS developers.

To use local dependencies, you need to tell the CryFS build how to get these dependencies. You can do this by writing a small CMake configuration file and passing it to the CryFS build using -DDEPENDENCY_CONFIG=filename. This configuration file needs to define a cmake target for each of the dependencies.

Here's an example config file that gets the dependencies from conan. And here's another example config file that works for getting dependencies that are locally installed in Ubuntu. You can create your own configuration file to tell the build how to get its dependencies and, for example, mix and match. Get some dependencies from Conan and others from the local system.

Creating .deb and .rpm packages

It is recommended to install CryFS using packages, because that allows for an easy way to uninstall it again once you don't need it anymore.

If you want to create a .rpm package, you need to install rpmbuild.

  1. Clone repository

    $ git clone https://github.com/cryfs/cryfs.git cryfs
    $ cd cryfs
    
  2. Build

    $ mkdir cmake && cd cmake
    $ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=off
    $ make package
    

Disclaimer

In the event of a password leak, you are strongly advised to create a new filesystem and copy all the data over from the previous one. Then, remove all copies of the compromised filesystem and config file(e.g, from the "previous versions" feature of your cloud system) to prevent access to the key (and, as a result, your data) using the leaked password.