1 #include "pEp_internal.h"
2 #include "pgp_netpgp.h"
9 #include <netpgp/config.h>
10 #include <netpgp/memory.h>
11 #include <netpgp/crypto.h>
12 #include <netpgp/netpgpsdk.h>
13 #include <netpgp/validate.h>
15 PEP_STATUS pgp_init(PEP_SESSION session, bool in_first)
18 PEP_STATUS status = PEP_STATUS_OK;
19 const char *home = NULL;
22 if(!session) return PEP_UNKNOWN_ERROR;
24 netpgp = &session->ctx;
27 if (strcmp(setlocale(LC_ALL, NULL), "C") == 0)
28 setlocale(LC_ALL, "");
31 memset(netpgp, 0x0, sizeof(session->ctx));
33 // netpgp_setvar(netpgp, "max mem alloc", "4194304");
34 netpgp_setvar(netpgp, "need seckey", "1");
35 netpgp_setvar(netpgp, "need userid", "1");
37 // NetPGP shares home with GPG
40 netpgp_set_homedir(netpgp,(char*)home, NULL, 0);
42 status = PEP_INIT_NO_GPG_HOME;
46 // pair with gpg's cert-digest-algo
47 netpgp_setvar(netpgp, "hash", "SHA256");
49 // subset of gpg's personal-cipher-preferences
50 // here only one cipher can be selected
51 netpgp_setvar(netpgp, "cipher", "AES256");
53 if (!netpgp_init(netpgp)) {
54 status = PEP_INIT_NETPGP_INIT_FAILED;
61 pgp_release(session, in_first);
65 void pgp_release(PEP_SESSION session, bool out_last)
72 netpgp = &session->ctx;
75 memset(netpgp, 0x0, sizeof(session->ctx));
77 // out_last unused here
80 PEP_STATUS pgp_decrypt_and_verify(
81 PEP_SESSION session, const char *ctext, size_t csize,
82 char **ptext, size_t *psize, stringlist_t **keylist
88 pgp_validation_t vresult;
95 stringlist_t *_keylist = NULL;
105 if(!session || !ctext || !csize || !ptext || !psize || !keylist)
106 return PEP_UNKNOWN_ERROR;
108 netpgp = &session->ctx;
115 memset(&vresult, 0x0, sizeof(vresult));
117 mem = pgp_decrypt_and_validate_buf(netpgp->io, &vresult, ctext, csize,
118 netpgp->secring, netpgp->pubring,
121 NULL, -1, NULL /* pass fp,attempts,cb */);
123 return PEP_OUT_OF_MEMORY;
126 _psize = pgp_mem_len(mem);
128 if ((_ptext = calloc(1, _psize)) == NULL) {
129 return PEP_OUT_OF_MEMORY;
131 result = PEP_DECRYPTED;
133 return PEP_DECRYPT_NO_KEY;
136 memcpy(_ptext, pgp_mem_data(mem), _psize);
137 pgp_memory_free(mem);
139 if (vresult.validc && !vresult.invalidc && !vresult.unknownc ) {
140 // resultp(io, "<stdin>", &vresult, netpgp->pubring);
141 // signedmem is freed from pgp_validate_mem
142 result = PEP_DECRYPTED_AND_VERIFIED;
144 if (vresult.validc + vresult.invalidc + vresult.unknownc == 0) {
145 // No signatures found - is this memory signed?
146 result = PEP_VERIFY_NO_KEY;
147 } else if (vresult.invalidc == 0 && vresult.unknownc == 0) {
148 // memory verification failure: invalid signature time
149 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
151 // memory verification failure:
152 // invalid signatures result.invalidc
153 // unknown signatures result.unknownc
154 result = PEP_DECRYPT_WRONG_FORMAT;
158 result = PEP_DECRYPTED_AND_VERIFIED;
159 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
160 result = PEP_DECRYPTED;
161 result = PEP_DECRYPT_WRONG_FORMAT;
162 result = PEP_DECRYPT_NO_KEY;
163 return PEP_OUT_OF_MEMORY;
165 //result = PEP_UNKNOWN_ERROR;
167 // _keylist = new_stringlist(NULL);
169 // if (_keylist == NULL) {
171 // return PEP_OUT_OF_MEMORY;
175 // k = stringlist_add(k, "SIGNATURE FPR"/*TODO*/);
176 // } while (0 /* TODO sign next*/);
178 if (result == PEP_DECRYPTED_AND_VERIFIED
179 || result == PEP_DECRYPTED) {
182 (*ptext)[*psize] = 0; // safeguard for naive users
183 // *keylist = _keylist;
186 // free_stringlist(_keylist);
192 PEP_STATUS pgp_verify_text(
193 PEP_SESSION session, const char *text, size_t size,
194 const char *signature, size_t sig_size, stringlist_t **keylist
198 stringlist_t *_keylist;
211 result = PEP_VERIFIED;
213 k = stringlist_add(k, "TODO");
215 free_stringlist(_keylist);
217 return PEP_OUT_OF_MEMORY;
219 } while (0 /*TODO*/);
222 result = PEP_UNENCRYPTED;
223 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
224 result = PEP_VERIFIED_AND_TRUSTED;
225 result = PEP_VERIFY_NO_KEY;
226 result = PEP_UNENCRYPTED;
227 result = PEP_DECRYPT_WRONG_FORMAT;
228 return PEP_OUT_OF_MEMORY;
230 result = PEP_UNKNOWN_ERROR;
235 PEP_STATUS pgp_encrypt_and_sign(
236 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
237 size_t psize, char **ctext, size_t *csize
241 const stringlist_t *_keylist;
254 for (_keylist = keylist, i = 0; _keylist != NULL; _keylist = _keylist->next, i++) {
255 assert(_keylist->value);
257 /* get key from _keylist->value */
258 /* add key to recipients/signers */
261 /* Do encrypt and sign */
262 char *_buffer = NULL;
263 size_t length = /* TODO length*/ 0;
264 assert(length != -1);
266 /* Allocate transferable buffer */
267 _buffer = malloc(length + 1);
269 if (_buffer == NULL) {
271 return PEP_OUT_OF_MEMORY;
276 (*ctext)[*csize] = 0; // safeguard for naive users
277 result = PEP_STATUS_OK;
280 result = PEP_UNKNOWN_ERROR;
284 PEP_STATUS pgp_generate_keypair(
285 PEP_SESSION session, pEp_identity *identity
289 const char *template =
294 /* "Passphrase: %s\n" */
300 assert(identity->address);
301 assert(identity->fpr == NULL);
302 assert(identity->username);
304 parms = calloc(1, PARMS_MAX);
307 return PEP_OUT_OF_MEMORY;
309 result = snprintf(parms, PARMS_MAX, template, identity->username,
311 assert(result < PARMS_MAX);
312 if (result >= PARMS_MAX) {
314 return PEP_BUFFER_TOO_SMALL;
317 /* TODO generate key */
321 return PEP_UNKNOWN_ERROR;
322 return PEP_ILLEGAL_VALUE;
323 return PEP_CANNOT_CREATE_KEY;
325 identity->fpr = strdup("TODO generated key fpr");
327 return PEP_STATUS_OK;
330 PEP_STATUS pgp_delete_keypair(PEP_SESSION session, const char *fpr)
335 /* TODO get key with given fpr */
336 return PEP_KEY_NOT_FOUND;
337 return PEP_ILLEGAL_VALUE;
338 return PEP_KEY_HAS_AMBIG_NAME;
339 return PEP_OUT_OF_MEMORY;
340 return PEP_UNKNOWN_ERROR;
342 /* TODO delete that key */
343 return PEP_UNKNOWN_ERROR;
344 return PEP_KEY_NOT_FOUND;
345 return PEP_KEY_HAS_AMBIG_NAME;
346 return PEP_UNKNOWN_ERROR;
348 return PEP_STATUS_OK;
351 PEP_STATUS pgp_import_keydata(PEP_SESSION session, const char *key_data, size_t size)
357 return PEP_UNKNOWN_ERROR;
358 return PEP_ILLEGAL_VALUE;
359 return PEP_UNKNOWN_ERROR;
360 return PEP_STATUS_OK;
363 PEP_STATUS pgp_export_keydata(
364 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
378 return PEP_KEY_NOT_FOUND;
379 return PEP_UNKNOWN_ERROR;
380 return PEP_UNKNOWN_ERROR;
382 _size = /* TODO */ 0;
385 buffer = malloc(_size + 1);
387 if (buffer == NULL) {
389 return PEP_OUT_OF_MEMORY;
392 // safeguard for the naive user
398 return PEP_STATUS_OK;
402 // "hkp://keys.gnupg.net"
403 PEP_STATUS pgp_recv_key(PEP_SESSION session, const char *pattern)
408 /* TODO ask for key */
409 return PEP_UNKNOWN_ERROR;
410 return PEP_GET_KEY_FAILED;
418 return PEP_STATUS_OK;
421 PEP_STATUS pgp_find_keys(
422 PEP_SESSION session, const char *pattern, stringlist_t **keylist
425 stringlist_t *_keylist;
435 return PEP_UNKNOWN_ERROR;
436 return PEP_GET_KEY_FAILED;
438 _keylist = new_stringlist(NULL);
439 stringlist_t *_k = _keylist;
442 fpr = "TODO key->subkeys->fpr";
444 _k = stringlist_add(_k, fpr);
447 free_stringlist(_keylist);
448 return PEP_OUT_OF_MEMORY;
453 return PEP_STATUS_OK;
456 PEP_STATUS pgp_send_key(PEP_SESSION session, const char *pattern)
463 return PEP_CANNOT_SEND_KEY;
464 return PEP_STATUS_OK;
468 PEP_STATUS pgp_get_key_rating(
471 PEP_comm_type *comm_type
474 PEP_STATUS status = PEP_STATUS_OK;
480 *comm_type = PEP_ct_unknown;
482 /* TODO get key from fpr */
483 return PEP_UNKNOWN_ERROR;
484 return PEP_GET_KEY_FAILED;
486 switch (/*TODO key->protocol*/ 4) {
487 case /* TODO OpenPGP */0:
488 case /* TODO DEFAULT */1:
489 *comm_type = PEP_ct_OpenPGP_unconfirmed;
491 case /* TODO CMS */2:
492 *comm_type = PEP_ct_CMS_unconfirmed;
495 *comm_type = PEP_ct_unknown;
496 return PEP_STATUS_OK;
499 for (; 1 == 0; /* Each subkeys */ ) {
500 if (/* TODO length */0 < 1024)
501 *comm_type = PEP_ct_key_too_short;
504 ( /* TODO pubkey_algo == RSA */ 0)
505 || (/* TODO pubkey_algo == RSA_E*/ 0)
506 || (/* TODO pubkey_algo == RSA_S*/ 0)
508 && /* sk->length */0 == 1024
510 *comm_type = PEP_ct_OpenPGP_weak_unconfirmed;
512 if (/* TODO invalid */ 1) {
513 *comm_type = PEP_ct_key_b0rken;
516 if (/* TODO expired */ 1) {
517 *comm_type = PEP_ct_key_expired;
520 if (/* TODO revoked*/ 1) {
521 *comm_type = PEP_ct_key_revoked;
525 *comm_type = PEP_ct_unknown;
526 return PEP_OUT_OF_MEMORY;
527 return PEP_UNKNOWN_ERROR;