= Using the RNP C API This document is for developers who wish to use RNP as a library in C. Examples are given below to demonstrate such usage. == Examples [TIP] .Location of examples ==== The source code of these examples can be found under `https://github.com/rnpgp/rnp/blob/main/src/examples/[src/examples]`. If you are planning to build from source, these examples are built together with the RNP library and will be available under `src/examples` within your build folder. ==== [TIP] ==== All samples below use APIs exposed via the header file `https://github.com/rnpgp/rnp/blob/main/include/rnp/rnp.h[include/rnp/rnp.h]`. For further details please refer to the file directly. ==== The following example applications are available: `generate`:: Demonstrates generating keys, save/load of keyrings, exporting keys. `encrypt`:: Demonstrates how to encrypt a file using a password and/or key. `decrypt`:: Demonstrates how to decrypt OpenPGP data using a key and/or password. `sign`:: Demonstrates how to sign messages, using one or more keys from a loaded keyring. `verify`:: Demonstrates how to verify signed messages using dynamic keys fetching (using a sample key provider implementation). `dump`:: Demonstrates how to dump OpenPGP packet information. === generate.c Location: https://github.com/rnpgp/rnp/blob/main/src/examples/generate.c This example is composed from 2 functions: * `ffi_generate_keys()`: Demonstrates how to generate and save different key types (RSA and EDDSA/Curve25519) using JSON key description. Also demonstrates usage of the password provider. + Keyrings will be saved to files `pubring.pgp` and `secring.pgp` in the current directory. You can use `rnp --list-packets pubring.pgp` to check the properties of the generated key(s). * `ffi_output_keys()`: Demonstrates how to load keyrings, search for keys (in helper functions `ffi_print_key()`/`ffi_export_key()`), and how to export them to memory or file in armored format. === encrypt.c Location: https://github.com/rnpgp/rnp/blob/main/src/examples/encrypt.c This code example does the following: * first loads a public keyring (`pubring.pgp`) (created by the `generate.c` example) * then creates an encryption operation structure and * configures it with various options (including the setup of password encryption and public-key encryption). The result is the encrypted and armored (for easier reading) message `RNP encryption sample message`. This message is saved to the file `encrypted.asc` in current directory. What you can do after: * Inspect the message with `rnp --list-packets encrypted.asc`. * Decrypt the saved file via `rnp --keyfile secring.pgp -d encrypted.asc`. === decrypt.c Location: https://github.com/rnpgp/rnp/blob/main/src/examples/decrypt.c This example uses keyrings generated from the `generate.c` example to decrypt messages encrypted by the `encrypt.c` example. This example demonstrates how to decrypt message with a password or with a key, and implements a custom password provider for decryption via key or key password. The decrypted message is saved to memory and then printed to the `stdout`. === sign.c Location: https://github.com/rnpgp/rnp/blob/main/src/examples/sign.c This example uses keyrings generated in the preceding `generate.c` example. It demonstrates configuration of a signing context, signing of the message, and the saving of the detached signature to the `signed.asc` file. Then the attached signature is used: i.e. the data is encapsulated into the resulting message. What you can do after: * Inspect the signed message with `rnp --list-packets signed.asc`. * Verify the message with `rnp --keyfile pubring.pgp -v signed.asc`. === verify.c Location: https://github.com/rnpgp/rnp/blob/main/src/examples/verify.c This example uses keyrings generated in the `generate.c` example. However, instead of loading the whole keyring, it implements dynamic key fetching via custom key provider (see function `example_key_provider`). After verification, it outputs the verified embedded message and all signatures to `stdout` (with signing key IDs and statuses). === dump.c Location: https://github.com/rnpgp/rnp/blob/main/src/examples/dump.c This example dumps OpenPGP packet information from the input stream (via `stdin` or filename), tuned with flags passed via the command-line interface. The resulting human-readable text or JSON is printed to `stdout`.