libpcp Documentation


This is the API documentation of libpcp, the library behind Pretty Curved Privacy (pcp). The library can be used independently of pcp to manage keys and to encrypt or sign files or buffers.

For most actual crypto related things, libpcp uses libsodium, the portable NaCL library.

Sample usage

Example use of the libpcp library:

#include <pcp.h>
int main() {
Buffer *inbuf;
pcp_key_t *alice, *bob;
pcp_pubkey_t *alicepub, *bobpub, *pubhash;
Pcpstream *clear_in, *crypt_out, *clear_out;
PCPCTX *ptx;
char message[] = "hello world";
printf("hh: %ld\n", sizeof(UT_hash_handle));
/* we always need a context */
ptx = ptx_new();
/* generate the keypairs for both */
alice = pcpkey_new();
bob = pcpkey_new();
pcpkey_setowner(alice, "alicia", "alicia@local");
/* get the public parts of them */
alicepub = pcpkey_pub_from_secret(alice);
bobpub = pcpkey_pub_from_secret(bob);
/* put the clear text message into the stream */
inbuf = buffer_new(32, "a");
buffer_add_str(inbuf, message);
clear_in = ps_new_inbuffer(inbuf);
/* create the output stream as buffer */
crypt_out = ps_new_outbuffer();
/* prepare the pubkey recipient list (only 1 recipient: Bob) */
pubhash = NULL;
strncpy(bobpub->id, pcp_getpubkeyid(bobpub), 17);
HASH_ADD_STR( pubhash, id, bobpub);
/* actually encrypt the message, don't sign it
Alice is the sender, Bob is the recipient */
pcp_encrypt_stream(ptx, clear_in, crypt_out, alice, pubhash, 0, 0);
/* now, print the encrypted result */
fprintf(stderr, "Alice encrypted %"FMT_SIZE_T" bytes for Bob:\n", (SIZE_T_CAST)strlen(message));
/* ---- encryption don, now decrypt ---- */
/* prepare the output buffer stream */
clear_out = ps_new_outbuffer();
/* in order for the decryptor find the senders public key,
we need to put it into the context hash. this step can be
omitted when using a Vault. */
pcphash_add(ptx, alicepub, alicepub->type);
/* try to decrypt the message */
if(pcp_decrypt_stream(ptx, crypt_out, clear_out, bob, NULL, 0, 0) == 0)
else {
/* and finally print out the decrypted message */
fprintf(stderr, "Bob decrypted %"FMT_SIZE_T" bytes from Alice:\n", (SIZE_T_CAST)buffer_size(ps_buffer(crypt_out)));
printf("Decrypted message: %s\n", buffer_get_str(ps_buffer(clear_out)));
return 0;

To compile the example, use the following commands:

g++ -c sample.o `pkg-config --cflags libpcp1`
g++ sample.o `pkg-config --libs libpcp1` -o sample