netpgp : decrypt and verify. Fixing needed in netpgp. netpgp cannot decrypt msg encrypted with gpg. netpgp can decrypt its own msg, but cannot verify own clearsign msg
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 mem = pgp_decrypt_buf(netpgp->io, ctext, csize,
116 netpgp->secring, netpgp->pubring,
119 NULL, -1, NULL /* pass fp,attempts,cb */);
121 return PEP_OUT_OF_MEMORY;
124 _psize = pgp_mem_len(mem);
125 if ((_ptext = calloc(1, _psize)) == NULL) {
126 return PEP_OUT_OF_MEMORY;
128 memcpy(_ptext, pgp_mem_data(mem), _psize);
130 result = PEP_DECRYPTED;
132 cat = pgp_memory_new();
138 result = PEP_DECRYPTED_AND_VERIFIED;
139 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
140 result = PEP_DECRYPTED;
141 result = PEP_DECRYPT_WRONG_FORMAT;
142 result = PEP_DECRYPT_NO_KEY;
143 return PEP_OUT_OF_MEMORY;
145 (void) memset(&vresult, 0x0, sizeof(vresult));
146 ret = pgp_validate_mem(io, &vresult, mem,
147 &cat, 1, netpgp->pubring);
149 // pgp_memory_free(mem) done by pgp_validate_mem
152 // resultp(io, "<stdin>", &vresult, netpgp->pubring);
153 // signedmem is freed from pgp_validate_mem
154 result = PEP_DECRYPTED_AND_VERIFIED;
156 if (vresult.validc + vresult.invalidc + vresult.unknownc == 0) {
157 // No signatures found - is this memory signed?
158 result = PEP_DECRYPT_NO_KEY;
159 } else if (vresult.invalidc == 0 && vresult.unknownc == 0) {
160 // memory verification failure: invalid signature time
161 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
163 // memory verification failure:
164 // invalid signatures result.invalidc
165 // unknown signatures result.unknownc
166 result = PEP_DECRYPT_WRONG_FORMAT;
169 //result = PEP_UNKNOWN_ERROR;
171 // _keylist = new_stringlist(NULL);
173 // if (_keylist == NULL) {
175 // return PEP_OUT_OF_MEMORY;
179 // k = stringlist_add(k, "SIGNATURE FPR"/*TODO*/);
180 // } while (0 /* TODO sign next*/);
182 pgp_memory_free(cat);
184 if (result == PEP_DECRYPTED_AND_VERIFIED
185 || result == PEP_DECRYPTED) {
188 (*ptext)[*psize] = 0; // safeguard for naive users
189 // *keylist = _keylist;
192 // free_stringlist(_keylist);
198 PEP_STATUS pgp_verify_text(
199 PEP_SESSION session, const char *text, size_t size,
200 const char *signature, size_t sig_size, stringlist_t **keylist
204 stringlist_t *_keylist;
217 result = PEP_VERIFIED;
219 k = stringlist_add(k, "TODO");
221 free_stringlist(_keylist);
223 return PEP_OUT_OF_MEMORY;
225 } while (0 /*TODO*/);
228 result = PEP_UNENCRYPTED;
229 result = PEP_DECRYPT_SIGNATURE_DOES_NOT_MATCH;
230 result = PEP_VERIFIED_AND_TRUSTED;
231 result = PEP_VERIFY_NO_KEY;
232 result = PEP_UNENCRYPTED;
233 result = PEP_DECRYPT_WRONG_FORMAT;
234 return PEP_OUT_OF_MEMORY;
236 result = PEP_UNKNOWN_ERROR;
241 PEP_STATUS pgp_encrypt_and_sign(
242 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
243 size_t psize, char **ctext, size_t *csize
247 const stringlist_t *_keylist;
260 for (_keylist = keylist, i = 0; _keylist != NULL; _keylist = _keylist->next, i++) {
261 assert(_keylist->value);
263 /* get key from _keylist->value */
264 /* add key to recipients/signers */
267 /* Do encrypt and sign */
268 char *_buffer = NULL;
269 size_t length = /* TODO length*/ 0;
270 assert(length != -1);
272 /* Allocate transferable buffer */
273 _buffer = malloc(length + 1);
275 if (_buffer == NULL) {
277 return PEP_OUT_OF_MEMORY;
282 (*ctext)[*csize] = 0; // safeguard for naive users
283 result = PEP_STATUS_OK;
286 result = PEP_UNKNOWN_ERROR;
290 PEP_STATUS pgp_generate_keypair(
291 PEP_SESSION session, pEp_identity *identity
295 const char *template =
300 /* "Passphrase: %s\n" */
306 assert(identity->address);
307 assert(identity->fpr == NULL);
308 assert(identity->username);
310 parms = calloc(1, PARMS_MAX);
313 return PEP_OUT_OF_MEMORY;
315 result = snprintf(parms, PARMS_MAX, template, identity->username,
317 assert(result < PARMS_MAX);
318 if (result >= PARMS_MAX) {
320 return PEP_BUFFER_TOO_SMALL;
323 /* TODO generate key */
327 return PEP_UNKNOWN_ERROR;
328 return PEP_ILLEGAL_VALUE;
329 return PEP_CANNOT_CREATE_KEY;
331 identity->fpr = strdup("TODO generated key fpr");
333 return PEP_STATUS_OK;
336 PEP_STATUS pgp_delete_keypair(PEP_SESSION session, const char *fpr)
341 /* TODO get key with given fpr */
342 return PEP_KEY_NOT_FOUND;
343 return PEP_ILLEGAL_VALUE;
344 return PEP_KEY_HAS_AMBIG_NAME;
345 return PEP_OUT_OF_MEMORY;
346 return PEP_UNKNOWN_ERROR;
348 /* TODO delete that key */
349 return PEP_UNKNOWN_ERROR;
350 return PEP_KEY_NOT_FOUND;
351 return PEP_KEY_HAS_AMBIG_NAME;
352 return PEP_UNKNOWN_ERROR;
354 return PEP_STATUS_OK;
357 PEP_STATUS pgp_import_keydata(PEP_SESSION session, const char *key_data, size_t size)
363 return PEP_UNKNOWN_ERROR;
364 return PEP_ILLEGAL_VALUE;
365 return PEP_UNKNOWN_ERROR;
366 return PEP_STATUS_OK;
369 PEP_STATUS pgp_export_keydata(
370 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
384 return PEP_KEY_NOT_FOUND;
385 return PEP_UNKNOWN_ERROR;
386 return PEP_UNKNOWN_ERROR;
388 _size = /* TODO */ 0;
391 buffer = malloc(_size + 1);
393 if (buffer == NULL) {
395 return PEP_OUT_OF_MEMORY;
398 // safeguard for the naive user
404 return PEP_STATUS_OK;
408 // "hkp://keys.gnupg.net"
409 PEP_STATUS pgp_recv_key(PEP_SESSION session, const char *pattern)
414 /* TODO ask for key */
415 return PEP_UNKNOWN_ERROR;
416 return PEP_GET_KEY_FAILED;
424 return PEP_STATUS_OK;
427 PEP_STATUS pgp_find_keys(
428 PEP_SESSION session, const char *pattern, stringlist_t **keylist
431 stringlist_t *_keylist;
441 return PEP_UNKNOWN_ERROR;
442 return PEP_GET_KEY_FAILED;
444 _keylist = new_stringlist(NULL);
445 stringlist_t *_k = _keylist;
448 fpr = "TODO key->subkeys->fpr";
450 _k = stringlist_add(_k, fpr);
453 free_stringlist(_keylist);
454 return PEP_OUT_OF_MEMORY;
459 return PEP_STATUS_OK;
462 PEP_STATUS pgp_send_key(PEP_SESSION session, const char *pattern)
469 return PEP_CANNOT_SEND_KEY;
470 return PEP_STATUS_OK;
474 PEP_STATUS pgp_get_key_rating(
477 PEP_comm_type *comm_type
480 PEP_STATUS status = PEP_STATUS_OK;
486 *comm_type = PEP_ct_unknown;
488 /* TODO get key from fpr */
489 return PEP_UNKNOWN_ERROR;
490 return PEP_GET_KEY_FAILED;
492 switch (/*TODO key->protocol*/ 4) {
493 case /* TODO OpenPGP */0:
494 case /* TODO DEFAULT */1:
495 *comm_type = PEP_ct_OpenPGP_unconfirmed;
497 case /* TODO CMS */2:
498 *comm_type = PEP_ct_CMS_unconfirmed;
501 *comm_type = PEP_ct_unknown;
502 return PEP_STATUS_OK;
505 for (; 1 == 0; /* Each subkeys */ ) {
506 if (/* TODO length */0 < 1024)
507 *comm_type = PEP_ct_key_too_short;
510 ( /* TODO pubkey_algo == RSA */ 0)
511 || (/* TODO pubkey_algo == RSA_E*/ 0)
512 || (/* TODO pubkey_algo == RSA_S*/ 0)
514 && /* sk->length */0 == 1024
516 *comm_type = PEP_ct_OpenPGP_weak_unconfirmed;
518 if (/* TODO invalid */ 1) {
519 *comm_type = PEP_ct_key_b0rken;
522 if (/* TODO expired */ 1) {
523 *comm_type = PEP_ct_key_expired;
526 if (/* TODO revoked*/ 1) {
527 *comm_type = PEP_ct_key_revoked;
531 *comm_type = PEP_ct_unknown;
532 return PEP_OUT_OF_MEMORY;
533 return PEP_UNKNOWN_ERROR;