Meet RNP, an RFC 4880-compliant OpenPGP library written in C++.
RNP was born at Ribose and is continuously maintained under its initiative.
Originally stemmed from NetPGP, it now shares little in common with its ancestor after a year of active development. A thorough rewrite of legacy code, resolving compatibility issues with GnuPG and other implementations, with improved performance and added cutting-edge features.
RNP also differs from other implementations — it is offered under a BSD 3-clause license, which means it is compatible for embedded distribution within GPL, MPL, MIT and most other open-source licenses, as well as being included in commercial binary distributions.
Feel free to use RNP in your software!
Getting started with RNP
If you are deploying OpenPGP in a Ruby-based application, there are bindings (see ruby-rnp RubyDocs).
Since RNP written in C++, you can call it from Objective-C code,
ctypes under Python.
It is a proper library, in contrast to GnuPG/GPGME (see GnuPG is not a library (2013)).
Ruby bindings are available with Python & Go bindings in the works, and you can use it wherever you can call C++ code.
Implemented in C++ and offers constant memory footprint with large amounts of data.
It offers comprehensive cipher support, including (uniquely) the SM algorithm family — a desirable feature if you deploy cryptography in mainland Chinese market.
Active development and focused on adding cutting-edge features.
Which algorithms does RNP support?
The following ciphers, encryption modes and hash functions are supported:
Symmetric: IDEA, Triple DES, CAST5, Blowfish, AES-128, AES-192, AES-256, Twofish, Camellia-128, Camellia-192, Camellia-256, SM4
Symmetric encryption modes: CFB, AEAD-EAX, AEAD-OCB
Hash: MD5, SHA1, RIPEMD160, SHA-256, SHA-384, SHA-512, SHA-224, SM3
Asymmetric: RSA, ElGamal, DSA, so-called DSA2 (i.e. DSA with keys larger then 1024 bits), ECDSA/ECDH (with some subset of curves which later on will be expanded), EdDSA, SM2.