netpgp : build, link, init, release.
1 #include "pEp_internal.h"
2 #include "pgp_netpgp.h"
9 PEP_STATUS pgp_init(PEP_SESSION session, bool in_first)
11 PEP_STATUS status = PEP_STATUS_OK;
12 const char *home = NULL;
15 if (strcmp(setlocale(LC_ALL, NULL), "C") == 0)
16 setlocale(LC_ALL, "");
19 memset(&session->ctx, 0x0, sizeof(session->ctx));
21 // NetPGP shares home with GPG
24 netpgp_set_homedir(&session->ctx,(char*)home, NULL, 0);
26 status = PEP_INIT_NO_GPG_HOME;
30 // pair with gpg's cert-digest-algo
31 netpgp_setvar(&session->ctx, "hash", "SHA256");
33 // subset of gpg's personal-cipher-preferences
34 // here only one cipher can be selected
35 netpgp_setvar(&session->ctx, "cipher", "AES256");
37 if (!netpgp_init(&session->ctx)) {
38 status = PEP_INIT_NETPGP_INIT_FAILED;
45 pgp_release(session, in_first);
49 void pgp_release(PEP_SESSION session, bool out_last)
51 netpgp_end(&session->ctx);
52 memset(&session->ctx, 0x0, sizeof(session->ctx));
54 // out_last unused here
57 PEP_STATUS pgp_decrypt_and_verify(
58 PEP_SESSION session, const char *ctext, size_t csize,
59 char **ptext, size_t *psize, stringlist_t **keylist
64 stringlist_t *_keylist = NULL;
78 /* TODO identify cipher text */
83 result = PEP_DECRYPTED_AND_VERIFIED;
84 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
85 result = PEP_DECRYPTED;
86 result = PEP_DECRYPT_WRONG_FORMAT;
87 result = PEP_DECRYPT_NO_KEY;
88 return PEP_OUT_OF_MEMORY;
90 result = PEP_UNKNOWN_ERROR;
92 _keylist = new_stringlist(NULL);
94 if (_keylist == NULL) {
96 return PEP_OUT_OF_MEMORY;
100 k = stringlist_add(k, "SIGNATURE FPR"/*TODO*/);
101 } while (0 /* TODO sign next*/);
106 PEP_STATUS pgp_verify_text(
107 PEP_SESSION session, const char *text, size_t size,
108 const char *signature, size_t sig_size, stringlist_t **keylist
112 stringlist_t *_keylist;
125 result = PEP_VERIFIED;
127 k = stringlist_add(k, "TODO");
129 free_stringlist(_keylist);
131 return PEP_OUT_OF_MEMORY;
133 } while (0 /*TODO*/);
136 result = PEP_UNENCRYPTED;
137 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
138 result = PEP_VERIFIED_AND_TRUSTED;
139 result = PEP_VERIFY_NO_KEY;
140 result = PEP_UNENCRYPTED;
141 result = PEP_DECRYPT_WRONG_FORMAT;
142 return PEP_OUT_OF_MEMORY;
144 result = PEP_UNKNOWN_ERROR;
149 PEP_STATUS pgp_encrypt_and_sign(
150 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
151 size_t psize, char **ctext, size_t *csize
155 const stringlist_t *_keylist;
168 for (_keylist = keylist, i = 0; _keylist != NULL; _keylist = _keylist->next, i++) {
169 assert(_keylist->value);
171 /* get key from _keylist->value */
172 /* add key to recipients/signers */
175 /* Do encrypt and sign */
176 char *_buffer = NULL;
177 size_t length = /* TODO length*/ 0;
178 assert(length != -1);
180 /* Allocate transferable buffer */
181 _buffer = malloc(length + 1);
183 if (_buffer == NULL) {
185 return PEP_OUT_OF_MEMORY;
190 (*ctext)[*csize] = 0; // safeguard for naive users
191 result = PEP_STATUS_OK;
194 result = PEP_UNKNOWN_ERROR;
198 PEP_STATUS pgp_generate_keypair(
199 PEP_SESSION session, pEp_identity *identity
203 const char *template =
208 /* "Passphrase: %s\n" */
214 assert(identity->address);
215 assert(identity->fpr == NULL);
216 assert(identity->username);
218 parms = calloc(1, PARMS_MAX);
221 return PEP_OUT_OF_MEMORY;
223 result = snprintf(parms, PARMS_MAX, template, identity->username,
225 assert(result < PARMS_MAX);
226 if (result >= PARMS_MAX) {
228 return PEP_BUFFER_TOO_SMALL;
231 /* TODO generate key */
235 return PEP_UNKNOWN_ERROR;
236 return PEP_ILLEGAL_VALUE;
237 return PEP_CANNOT_CREATE_KEY;
239 identity->fpr = strdup("TODO generated key fpr");
241 return PEP_STATUS_OK;
244 PEP_STATUS pgp_delete_keypair(PEP_SESSION session, const char *fpr)
249 /* TODO get key with given fpr */
250 return PEP_KEY_NOT_FOUND;
251 return PEP_ILLEGAL_VALUE;
252 return PEP_KEY_HAS_AMBIG_NAME;
253 return PEP_OUT_OF_MEMORY;
254 return PEP_UNKNOWN_ERROR;
256 /* TODO delete that key */
257 return PEP_UNKNOWN_ERROR;
258 return PEP_KEY_NOT_FOUND;
259 return PEP_KEY_HAS_AMBIG_NAME;
260 return PEP_UNKNOWN_ERROR;
262 return PEP_STATUS_OK;
265 PEP_STATUS pgp_import_key(PEP_SESSION session, const char *key_data, size_t size)
271 return PEP_UNKNOWN_ERROR;
272 return PEP_ILLEGAL_VALUE;
273 return PEP_UNKNOWN_ERROR;
274 return PEP_STATUS_OK;
277 PEP_STATUS pgp_export_key(
278 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
292 return PEP_KEY_NOT_FOUND;
293 return PEP_UNKNOWN_ERROR;
294 return PEP_UNKNOWN_ERROR;
296 _size = /* TODO */ 0;
299 buffer = malloc(_size + 1);
301 if (buffer == NULL) {
303 return PEP_OUT_OF_MEMORY;
306 // safeguard for the naive user
312 return PEP_STATUS_OK;
316 // "hkp://keys.gnupg.net"
317 PEP_STATUS pgp_recv_key(PEP_SESSION session, const char *pattern)
322 /* TODO ask for key */
323 return PEP_UNKNOWN_ERROR;
324 return PEP_GET_KEY_FAILED;
332 return PEP_STATUS_OK;
335 PEP_STATUS pgp_find_keys(
336 PEP_SESSION session, const char *pattern, stringlist_t **keylist
339 stringlist_t *_keylist;
349 return PEP_UNKNOWN_ERROR;
350 return PEP_GET_KEY_FAILED;
352 _keylist = new_stringlist(NULL);
353 stringlist_t *_k = _keylist;
356 fpr = "TODO key->subkeys->fpr";
358 _k = stringlist_add(_k, fpr);
361 free_stringlist(_keylist);
362 return PEP_OUT_OF_MEMORY;
367 return PEP_STATUS_OK;
370 PEP_STATUS pgp_send_key(PEP_SESSION session, const char *pattern)
377 return PEP_CANNOT_SEND_KEY;
378 return PEP_STATUS_OK;
382 PEP_STATUS pgp_get_key_rating(
385 PEP_comm_type *comm_type
388 PEP_STATUS status = PEP_STATUS_OK;
394 *comm_type = PEP_ct_unknown;
396 /* TODO get key from fpr */
397 return PEP_UNKNOWN_ERROR;
398 return PEP_GET_KEY_FAILED;
400 switch (/*TODO key->protocol*/ 4) {
401 case /* TODO OpenPGP */0:
402 case /* TODO DEFAULT */1:
403 *comm_type = PEP_ct_OpenPGP_unconfirmed;
405 case /* TODO CMS */2:
406 *comm_type = PEP_ct_CMS_unconfirmed;
409 *comm_type = PEP_ct_unknown;
410 return PEP_STATUS_OK;
413 for (; 1 == 0; /* Each subkeys */ ) {
414 if (/* TODO length */0 < 1024)
415 *comm_type = PEP_ct_key_too_short;
418 ( /* TODO pubkey_algo == RSA */ 0)
419 || (/* TODO pubkey_algo == RSA_E*/ 0)
420 || (/* TODO pubkey_algo == RSA_S*/ 0)
422 && /* sk->length */0 == 1024
424 *comm_type = PEP_ct_OpenPGP_weak_unconfirmed;
426 if (/* TODO invalid */ 1) {
427 *comm_type = PEP_ct_key_b0rken;
430 if (/* TODO expired */ 1) {
431 *comm_type = PEP_ct_key_expired;
434 if (/* TODO revoked*/ 1) {
435 *comm_type = PEP_ct_key_revoked;
439 *comm_type = PEP_ct_unknown;
440 return PEP_OUT_OF_MEMORY;
441 return PEP_UNKNOWN_ERROR;