NeoPG implements the OpenPGP standard.
NeoPG is written in C++11. It starts out as an opinionated fork of the GnuPG code base, and hopefully will evolve to something entirely different.
For now, many parts of NeoPG are licensed by the upstream authors under various licenses, including GPL and LGPL variants. Please refer to the copyright notice at the top of every file.
New source code contributed by the NeoPG authors is licensed under the
permissive Simplified BSD
license (the same license as Botan, the
cryptography library we want to use).
AT THIS TIME, THE COMPLETE WORK IS NECESSARILY LICENSED UNDER THE MOST RESTRICTIVE LICENSE OF ANY OF ITS PARTS, THE GPLv3. See the file license.txt for details.
The dependencies are also released under their respective various licenses.
Note: As we are using libcurl, you might have to pay attention to possible license incompatibilities between the GPL as used by the legacy gnupg code and the TLS library linked to libcurl. In the future, when libcurl supports Botan as TLS option, we might include a copy and link statically to make this easier.
Status
Currently, NeoPG is under development, and in an exploratory phase. No promises are made about the stability, functionality, and security of the development releases "0.0.x". I am actively seeking feedback and guidance for the API design and scope of functionality from users and application developers.
From a purely practical point, the software should build and run, and a lot of legacy functionality is available through the "gpg2", "gpg-agent", "dirmngr" etc. subcommands. New subcommands are introduced as functionality is added or replaced.
From an organizational point of view, this is currently a one-man project without third-party funding. A significant amount of time is spent on developing a more substantial basis for the project. So you will see periods of coding activity, but also periods of organizational activity (such as talks, and grant application writing).
Installation
Supported Compiler Versions
- Ubuntu 14.04.5 LTS: GCC 4.9, 5, 6, 7
- Ubuntu 14.04.5 LTS: Clang 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0
- MacOS: Xcode 6.4, 7.3, 8.3, 9.1
GCC 4.8 is not supported (see nlohmann/json).
Dependencies
Aside from a working C++ toolchain you'll need the following libraries.
- CMake >= 3.2
- SQLite >= 3.0
- Botan >= 2.0 --with-zlib --with-bzip2
- Boost >= 1.64.0
- libcurl >= 7.49.0
- gettext-tools
Make
With all dependencies installed NeoPG can be build with CMake.
$ git submodule update --init
$ cmake -H. -Bbuild
$ cmake --build build
$ cmake --build build --target test # opt: ARGS=-V or CTEST_OUTPUT_ON_FAILURE=1
To install (default is /usr/local)
$ cmake --build build --target install
To change default installation, set cmake parameter CMAKE_INSTALL_PREFIX
for example:
$ cmake -H. -Build -DCMAKE_INSTALL_PREFIX=<path>
Select your compiler and language version by setting CXX and CXXSTD environment variables, e.g.:
$ CXX=clang++-5 CXXSTD=14 cmake -H. -Bbuild
or set cmake parameter CMAKE_CXX_COMPILER
CMAKE_CXX_STANDARD
Legacy support
You can create links to the neopg
binary under a name that ends with
a legacy subcommand. If called through such a link, neopg
will
invoke that subcommand directly. For example, neo-gpg2 --version
would be the same as neopg gpg2 --version
, and so on. Examples for
names that would behave that way are neopg-gpg2
, neo-gpg2
,
neogpg2
, gpg2
etc. Here is a list of supported endings:
Ending | Subcommand |
---|---|
gpg |
gpg2 |
gpg2 |
gpg2 |
agent |
agent |
scd |
scd |
dirmngr |
dirmngr |
dirmngr-client |
dirmngr-client |
Development
Development builds have extra dependencies:
- gcovr (make coverage)
- clang-format (make pretty)
- cppcheck (make lint; TODO: Replace with cmake-tidy?)
- doxygen (make doc)
To enable a debug build, set the CMAKE_BUILD_TYPE flag (default is Release
):
$ cmake -DCMAKE_BUILD_TYPE=Debug -DCOVERAGE=ON ..
$ cmake --build build --target coverage
Other targets:
$ cmake --build build --target pretty # Run clang-format on all source files
$ cmake --build build --target lint # Run cppcheck
$ cmake --build build --target coverage # Just coverage.info for codecov.io
$ cmake --build build --target coverage-html # Local HTML report
$ cmake --build build --target coverage-data # Cobertura XML report
TODO
- format strings for list-keys etc
Code metrics:
- sloccount, git-loc
- secretgrind
- sonarqube
Windows
- chocolatey
macOS
- brew (homebrew)
openpgp profile
- ascii armor default
- auto keylocate default auto keyretrieve
- dirmngr: hkps connections should default to system trust if --hkp-cacert is not given
Hacking
Fedora
To get started on Fedora 28, or later, do the following.
# Install dev dependencies
$ sudo dnf install -y \
boost-devel \
botan2-devel \
cmake \
gcc-c++ \
gcovr \
git \
gnutls-devel \
lcov \
libusbx-devel \
python \
sqlite-devel \
# Clone repo and build
$ git clone --recursive [email protected]:das-labor/neopg.git
$ cmake -Hneopg -Bneopg/build
$ cmake --build neopg/build
macOS
To get started on macOS, follow these steps. For the dependencies use a package manager like Homebrew:
$ brew install botan boost cmake doxygen gettext
By default homebrew does not link the gettext binaries into the path, to enforce this:
$ brew link gettext --force
Build it!
# Clone repo and build
$ git clone --recursive [email protected]:das-labor/neopg.git
$ cmake -Hneopg -Bneopg/build
$ cmake --build neopg/build
Have fun!