1 #include "pEp_internal.h"
2 #include "dynamic_api.h"
3 #include "cryptotech.h"
8 static int init_count = -1;
10 static int user_version(void *_version, int count, char **text, char **name)
14 assert(text && text[0]);
15 if (!(_version && count == 1 && text && text[0]))
18 int *version = (int *) _version;
19 *version = atoi(text[0]);
23 DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
25 PEP_STATUS status = PEP_STATUS_OK;
27 static const char *sql_log;
28 static const char *sql_trustword;
29 static const char *sql_get_identity;
30 static const char *sql_set_person;
31 static const char *sql_set_device_group;
32 static const char *sql_get_device_group;
33 static const char *sql_set_pgp_keypair;
34 static const char *sql_set_identity;
35 static const char *sql_set_identity_flags;
36 static const char *sql_set_trust;
37 static const char *sql_get_trust;
38 static const char *sql_least_trust;
39 static const char *sql_mark_as_compromized;
40 static const char *sql_crashdump;
41 static const char *sql_languagelist;
42 static const char *sql_i18n_token;
45 static const char *sql_blacklist_add;
46 static const char *sql_blacklist_delete;
47 static const char *sql_blacklist_is_listed;
48 static const char *sql_blacklist_retrieve;
51 static const char *sql_own_key_is_listed;
52 static const char *sql_own_identities_retrieve;
55 static const char *sql_sequence_value1;
56 static const char *sql_sequence_value2;
57 static const char *sql_sequence_value3;
59 // Revocation tracking
60 static const char *sql_set_revoked;
61 static const char *sql_get_revoked;
63 bool in_first = false;
65 assert(sqlite3_threadsafe());
66 if (!sqlite3_threadsafe())
67 return PEP_INIT_SQLITE3_WITHOUT_MUTEX;
69 // a little race condition - but still a race condition
70 // mitigated by calling caveat (see documentation)
78 return PEP_ILLEGAL_VALUE;
82 pEpSession *_session = calloc(1, sizeof(pEpSession));
87 _session->version = PEP_ENGINE_VERSION;
90 if (LOCAL_DB == NULL) {
91 status = PEP_INIT_CANNOT_OPEN_DB;
95 int_result = sqlite3_open_v2(
100 | SQLITE_OPEN_FULLMUTEX
101 | SQLITE_OPEN_PRIVATECACHE,
105 if (int_result != SQLITE_OK) {
106 status = PEP_INIT_CANNOT_OPEN_DB;
110 sqlite3_busy_timeout(_session->db, BUSY_WAIT_TIME);
113 if (SYSTEM_DB == NULL) {
114 status = PEP_INIT_CANNOT_OPEN_SYSTEM_DB;
118 int_result = sqlite3_open_v2(
119 SYSTEM_DB, &_session->system_db,
121 | SQLITE_OPEN_FULLMUTEX
122 | SQLITE_OPEN_SHAREDCACHE,
126 if (int_result != SQLITE_OK) {
127 status = PEP_INIT_CANNOT_OPEN_SYSTEM_DB;
131 sqlite3_busy_timeout(_session->system_db, 1000);
133 // increment this when patching DDL
134 #define _DDL_USER_VERSION "3"
138 int_result = sqlite3_exec(
140 "create table if not exists version_info (\n"
141 " id integer primary key,\n"
142 " timestamp integer default (datetime('now')),\n"
150 int_result = sqlite3_exec(
152 "PRAGMA application_id = 0x23423423;\n"
153 "create table if not exists log (\n"
154 " timestamp integer default (datetime('now')),\n"
155 " title text not null,\n"
156 " entity text not null,\n"
157 " description text,\n"
160 "create index if not exists log_timestamp on log (\n"
163 "create table if not exists pgp_keypair (\n"
164 " fpr text primary key,\n"
165 " public_id text unique,\n"
166 " private_id text,\n"
167 " created integer,\n"
168 " expires integer,\n"
170 " flags integer default 0\n"
172 "create index if not exists pgp_keypair_expires on pgp_keypair (\n"
175 "create table if not exists person (\n"
176 " id text primary key,\n"
177 " username text not null,\n"
178 " main_key_id text\n"
179 " references pgp_keypair (fpr)\n"
180 " on delete set null,\n"
183 " device_group text\n"
185 "create table if not exists identity (\n"
188 " references person (id)\n"
189 " on delete cascade,\n"
190 " main_key_id text\n"
191 " references pgp_keypair (fpr)\n"
192 " on delete set null,\n"
194 " flags integer default 0,"
195 " primary key (address, user_id)\n"
197 "create table if not exists trust (\n"
198 " user_id text not null\n"
199 " references person (id)\n"
200 " on delete cascade,\n"
201 " pgp_keypair_fpr text not null\n"
202 " references pgp_keypair (fpr)\n"
203 " on delete cascade,\n"
204 " comm_type integer not null,\n"
206 " primary key (user_id, pgp_keypair_fpr)\n"
209 "create table if not exists blacklist_keys (\n"
210 " fpr text primary key\n"
213 "create table if not exists sequences(\n"
214 " name text primary key,\n"
215 " value integer default 0,\n"
216 " own integer default 0\n"
218 "create table if not exists revoked_keys (\n"
219 " revoked_fpr text primary key,\n"
220 " replacement_fpr text not null\n"
221 " references pgp_keypair (fpr)\n"
222 " on delete cascade,\n"
223 " revocation_date integer\n"
230 assert(int_result == SQLITE_OK);
233 int_result = sqlite3_exec(
235 "pragma user_version;",
240 assert(int_result == SQLITE_OK);
243 int_result = sqlite3_exec(
245 "alter table identity\n"
246 " add column flags integer default 0;\n",
254 int_result = sqlite3_exec(
256 "alter table pgp_keypair\n"
257 " add column flags integer default 0;\n"
258 "alter table person\n"
259 " add column device_group text;\n",
267 int_result = sqlite3_exec(
269 "alter table sequences\n"
270 " add column own integer default 0;\n",
277 if (version < atoi(_DDL_USER_VERSION)) {
278 int_result = sqlite3_exec(
280 "pragma user_version = "_DDL_USER_VERSION";\n"
281 "insert or replace into version_info (id, version)"
282 "values (1, '" PEP_ENGINE_VERSION "');",
287 assert(int_result == SQLITE_OK);
290 if (version <= atoi(_DDL_USER_VERSION)) {
291 int_result = sqlite3_exec(
293 "pragma user_version = "_DDL_USER_VERSION";\n"
294 "insert or replace into version_info (id, version)"
295 "values (1, '" PEP_ENGINE_VERSION "');",
300 assert(int_result == SQLITE_OK);
303 sql_log = "insert into log (title, entity, description, comment)"
304 "values (?1, ?2, ?3, ?4);";
306 sql_get_identity = "select fpr, username, comm_type, lang,"
307 " identity.flags | pgp_keypair.flags"
309 " join person on id = identity.user_id"
310 " join pgp_keypair on fpr = identity.main_key_id"
311 " join trust on id = trust.user_id"
312 " and pgp_keypair_fpr = identity.main_key_id"
313 " where address = ?1 and identity.user_id = ?2;";
315 sql_trustword = "select id, word from wordlist where lang = lower(?1) "
318 // Set person, but if already exist, only update.
319 // if main_key_id already set, don't touch.
320 sql_set_person = "insert or replace into person (id, username, lang, main_key_id)"
321 " values (?1, ?2, ?3,"
322 " (select coalesce((select main_key_id from person "
323 " where id = ?1), upper(replace(?4,' ',''))))) ;";
325 sql_set_device_group = "update person set device_group = ?1 "
326 "where user_id = '" PEP_OWN_USERID "';";
328 sql_get_device_group = "select device_group from person "
329 "where user_id = '" PEP_OWN_USERID "';";
331 sql_set_pgp_keypair = "insert or replace into pgp_keypair (fpr) "
332 "values (upper(replace(?1,' ',''))) ;";
334 sql_set_identity = "insert or replace into identity (address, main_key_id, "
335 "user_id, flags) values (?1, upper(replace(?2,' ','')),"
338 sql_set_identity_flags = "update identity set flags = ?1 & 255 "
339 "where address = ?2 and user_id = ?3 ;";
341 sql_set_trust = "insert or replace into trust (user_id, pgp_keypair_fpr, comm_type) "
342 "values (?1, upper(replace(?2,' ','')), ?3) ;";
344 sql_get_trust = "select comm_type from trust where user_id = ?1 "
345 "and pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
347 sql_least_trust = "select min(comm_type) from trust where pgp_keypair_fpr = upper(replace(?1,' ','')) ;";
349 sql_mark_as_compromized = "update trust not indexed set comm_type = 15"
350 " where pgp_keypair_fpr = upper(replace(?1,' ','')) ;";
352 sql_crashdump = "select timestamp, title, entity, description, comment"
353 " from log order by timestamp desc limit ?1 ;";
355 sql_languagelist = "select i18n_language.lang, name, phrase from i18n_language join i18n_token using (lang) where i18n_token.id = 1000;" ;
357 sql_i18n_token = "select phrase from i18n_token where lang = lower(?1) and id = ?2 ;";
361 sql_blacklist_add = "insert or replace into blacklist_keys (fpr) values (upper(replace(?1,' ',''))) ;"
362 "delete from identity where main_key_id = upper(replace(?1,' ','')) ;"
363 "delete from pgp_keypair where fpr = upper(replace(?1,' ','')) ;";
365 sql_blacklist_delete = "delete from blacklist_keys where fpr = upper(replace(?1,' ','')) ;";
367 sql_blacklist_is_listed = "select count(*) from blacklist_keys where fpr = upper(replace(?1,' ','')) ;";
369 sql_blacklist_retrieve = "select * from blacklist_keys ;";
373 sql_own_key_is_listed =
374 "select count(*) from ("
375 " select main_key_id from person "
376 " where main_key_id = upper(replace(?1,' ',''))"
377 " and id = '" PEP_OWN_USERID "' "
379 " select main_key_id from identity "
380 " where main_key_id = upper(replace(?1,' ',''))"
381 " and user_id = '" PEP_OWN_USERID "' );";
383 sql_own_identities_retrieve = "select address, fpr, username, "
384 " lang, identity.flags | pgp_keypair.flags"
386 " join person on id = identity.user_id"
387 " join pgp_keypair on fpr = identity.main_key_id"
388 " join trust on id = trust.user_id"
389 " and pgp_keypair_fpr = identity.main_key_id"
390 " where identity.user_id = '" PEP_OWN_USERID "';";
392 sql_sequence_value1 = "insert or replace into sequences (name, value, own) "
394 "(select coalesce((select value + 1 from sequences "
395 "where name = ?1), 1 )), ?2) ; ";
396 sql_sequence_value2 = "select value, own from sequences where name = ?1 ;";
397 sql_sequence_value3 = "update sequences set value = ?2, own = ?3 where name = ?1 ;";
399 sql_set_revoked = "insert or replace into revoked_keys ("
400 " revoked_fpr, replacement_fpr, revocation_date) "
401 "values (upper(replace(?1,' ','')),"
402 " upper(replace(?2,' ','')),"
405 sql_get_revoked = "select revoked_fpr, revocation_date from revoked_keys"
406 " where replacement_fpr = upper(replace(?1,' ','')) ;";
409 int_result = sqlite3_prepare_v2(_session->db, sql_log,
410 (int)strlen(sql_log), &_session->log, NULL);
411 assert(int_result == SQLITE_OK);
413 int_result = sqlite3_prepare_v2(_session->system_db, sql_trustword,
414 (int)strlen(sql_trustword), &_session->trustword, NULL);
415 assert(int_result == SQLITE_OK);
417 int_result = sqlite3_prepare_v2(_session->db, sql_get_identity,
418 (int)strlen(sql_get_identity), &_session->get_identity, NULL);
419 assert(int_result == SQLITE_OK);
421 int_result = sqlite3_prepare_v2(_session->db, sql_set_person,
422 (int)strlen(sql_set_person), &_session->set_person, NULL);
423 assert(int_result == SQLITE_OK);
425 int_result = sqlite3_prepare_v2(_session->db, sql_set_device_group,
426 (int)strlen(sql_set_device_group), &_session->set_device_group, NULL);
427 assert(int_result == SQLITE_OK);
429 int_result = sqlite3_prepare_v2(_session->db, sql_get_device_group,
430 (int)strlen(sql_get_device_group), &_session->get_device_group, NULL);
431 assert(int_result == SQLITE_OK);
433 int_result = sqlite3_prepare_v2(_session->db, sql_set_pgp_keypair,
434 (int)strlen(sql_set_pgp_keypair), &_session->set_pgp_keypair,
436 assert(int_result == SQLITE_OK);
438 int_result = sqlite3_prepare_v2(_session->db, sql_set_identity,
439 (int)strlen(sql_set_identity), &_session->set_identity, NULL);
440 assert(int_result == SQLITE_OK);
442 int_result = sqlite3_prepare_v2(_session->db, sql_set_identity_flags,
443 (int)strlen(sql_set_identity_flags), &_session->set_identity_flags,
445 assert(int_result == SQLITE_OK);
447 int_result = sqlite3_prepare_v2(_session->db, sql_set_trust,
448 (int)strlen(sql_set_trust), &_session->set_trust, NULL);
449 assert(int_result == SQLITE_OK);
451 int_result = sqlite3_prepare_v2(_session->db, sql_get_trust,
452 (int)strlen(sql_get_trust), &_session->get_trust, NULL);
453 assert(int_result == SQLITE_OK);
455 int_result = sqlite3_prepare_v2(_session->db, sql_least_trust,
456 (int)strlen(sql_least_trust), &_session->least_trust, NULL);
457 assert(int_result == SQLITE_OK);
459 int_result = sqlite3_prepare_v2(_session->db, sql_mark_as_compromized,
460 (int)strlen(sql_mark_as_compromized), &_session->mark_compromized,
462 assert(int_result == SQLITE_OK);
464 int_result = sqlite3_prepare_v2(_session->db, sql_crashdump,
465 (int)strlen(sql_crashdump), &_session->crashdump, NULL);
466 assert(int_result == SQLITE_OK);
468 int_result = sqlite3_prepare_v2(_session->system_db, sql_languagelist,
469 (int)strlen(sql_languagelist), &_session->languagelist, NULL);
470 assert(int_result == SQLITE_OK);
472 int_result = sqlite3_prepare_v2(_session->system_db, sql_i18n_token,
473 (int)strlen(sql_i18n_token), &_session->i18n_token, NULL);
474 assert(int_result == SQLITE_OK);
478 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_add,
479 (int)strlen(sql_blacklist_add), &_session->blacklist_add, NULL);
480 assert(int_result == SQLITE_OK);
482 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_delete,
483 (int)strlen(sql_blacklist_delete), &_session->blacklist_delete,
485 assert(int_result == SQLITE_OK);
487 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_is_listed,
488 (int)strlen(sql_blacklist_is_listed),
489 &_session->blacklist_is_listed, NULL);
490 assert(int_result == SQLITE_OK);
492 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_retrieve,
493 (int)strlen(sql_blacklist_retrieve), &_session->blacklist_retrieve,
495 assert(int_result == SQLITE_OK);
499 int_result = sqlite3_prepare_v2(_session->db, sql_own_key_is_listed,
500 (int)strlen(sql_own_key_is_listed), &_session->own_key_is_listed,
502 assert(int_result == SQLITE_OK);
504 int_result = sqlite3_prepare_v2(_session->db, sql_own_identities_retrieve,
505 (int)strlen(sql_own_identities_retrieve),
506 &_session->own_identities_retrieve, NULL);
507 assert(int_result == SQLITE_OK);
511 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value1,
512 (int)strlen(sql_sequence_value1), &_session->sequence_value1,
514 assert(int_result == SQLITE_OK);
516 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value2,
517 (int)strlen(sql_sequence_value2), &_session->sequence_value2,
519 assert(int_result == SQLITE_OK);
521 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value3,
522 (int)strlen(sql_sequence_value3), &_session->sequence_value3,
524 assert(int_result == SQLITE_OK);
526 // Revocation tracking
528 int_result = sqlite3_prepare_v2(_session->db, sql_set_revoked,
529 (int)strlen(sql_set_revoked), &_session->set_revoked, NULL);
530 assert(int_result == SQLITE_OK);
532 int_result = sqlite3_prepare_v2(_session->db, sql_get_revoked,
533 (int)strlen(sql_get_revoked), &_session->get_revoked, NULL);
534 assert(int_result == SQLITE_OK);
536 status = init_cryptotech(_session, in_first);
537 if (status != PEP_STATUS_OK)
540 status = init_transport_system(_session, in_first);
541 if (status != PEP_STATUS_OK)
544 status = log_event(_session, "init", "pEp " PEP_ENGINE_VERSION, NULL, NULL);
545 if (status != PEP_STATUS_OK)
551 _session->use_only_own_private_keys = true;
552 #elif TARGET_OS_IPHONE
553 _session->use_only_own_private_keys = true;
555 _session->use_only_own_private_keys = false;
559 return PEP_STATUS_OK;
562 status = PEP_OUT_OF_MEMORY;
569 DYNAMIC_API void release(PEP_SESSION session)
571 bool out_last = false;
573 assert(init_count >= 0);
576 if (!((init_count >= 0) && session))
579 // a small race condition but still a race condition
580 // mitigated by calling caveat (see documentation)
587 if (session->sync_state != DeviceState_state_NONE)
588 unregister_sync_callbacks(session);
592 sqlite3_finalize(session->log);
593 if (session->trustword)
594 sqlite3_finalize(session->trustword);
595 if (session->get_identity)
596 sqlite3_finalize(session->get_identity);
597 if (session->set_person)
598 sqlite3_finalize(session->set_person);
599 if (session->set_device_group)
600 sqlite3_finalize(session->set_device_group);
601 if (session->get_device_group)
602 sqlite3_finalize(session->get_device_group);
603 if (session->set_pgp_keypair)
604 sqlite3_finalize(session->set_pgp_keypair);
605 if (session->set_identity)
606 sqlite3_finalize(session->set_identity);
607 if (session->set_identity_flags)
608 sqlite3_finalize(session->set_identity_flags);
609 if (session->set_trust)
610 sqlite3_finalize(session->set_trust);
611 if (session->get_trust)
612 sqlite3_finalize(session->get_trust);
613 if (session->least_trust)
614 sqlite3_finalize(session->least_trust);
615 if (session->mark_compromized)
616 sqlite3_finalize(session->mark_compromized);
617 if (session->crashdump)
618 sqlite3_finalize(session->crashdump);
619 if (session->languagelist)
620 sqlite3_finalize(session->languagelist);
621 if (session->i18n_token)
622 sqlite3_finalize(session->i18n_token);
623 if (session->blacklist_add)
624 sqlite3_finalize(session->blacklist_add);
625 if (session->blacklist_delete)
626 sqlite3_finalize(session->blacklist_delete);
627 if (session->blacklist_is_listed)
628 sqlite3_finalize(session->blacklist_is_listed);
629 if (session->blacklist_retrieve)
630 sqlite3_finalize(session->blacklist_retrieve);
631 if (session->own_key_is_listed)
632 sqlite3_finalize(session->own_key_is_listed);
633 if (session->own_identities_retrieve)
634 sqlite3_finalize(session->own_identities_retrieve);
635 if (session->sequence_value1)
636 sqlite3_finalize(session->sequence_value1);
637 if (session->sequence_value2)
638 sqlite3_finalize(session->sequence_value2);
639 if (session->sequence_value3)
640 sqlite3_finalize(session->sequence_value3);
641 if (session->set_revoked)
642 sqlite3_finalize(session->set_revoked);
643 if (session->get_revoked)
644 sqlite3_finalize(session->get_revoked);
647 sqlite3_close_v2(session->db);
648 if (session->system_db)
649 sqlite3_close_v2(session->system_db);
652 release_transport_system(session, out_last);
653 release_cryptotech(session, out_last);
659 DYNAMIC_API void config_passive_mode(PEP_SESSION session, bool enable)
662 session->passive_mode = enable;
665 DYNAMIC_API void config_unencrypted_subject(PEP_SESSION session, bool enable)
668 session->unencrypted_subject = enable;
671 DYNAMIC_API void config_use_only_own_private_keys(PEP_SESSION session,
675 session->use_only_own_private_keys = enable;
678 DYNAMIC_API void config_keep_sync_msg(PEP_SESSION session, bool enable)
681 session->keep_sync_msg = enable;
684 DYNAMIC_API PEP_STATUS log_event(
688 const char *description,
692 PEP_STATUS status = PEP_STATUS_OK;
699 if (!(session && title && entity))
700 return PEP_ILLEGAL_VALUE;
702 sqlite3_reset(session->log);
703 sqlite3_bind_text(session->log, 1, title, -1, SQLITE_STATIC);
704 sqlite3_bind_text(session->log, 2, entity, -1, SQLITE_STATIC);
706 sqlite3_bind_text(session->log, 3, description, -1, SQLITE_STATIC);
708 sqlite3_bind_null(session->log, 3);
710 sqlite3_bind_text(session->log, 4, comment, -1, SQLITE_STATIC);
712 sqlite3_bind_null(session->log, 4);
714 result = sqlite3_step(session->log);
715 assert(result == SQLITE_DONE || result == SQLITE_BUSY);
716 if (result != SQLITE_DONE && result != SQLITE_BUSY)
717 status = PEP_UNKNOWN_ERROR;
718 } while (result == SQLITE_BUSY);
719 sqlite3_reset(session->log);
724 DYNAMIC_API PEP_STATUS trustword(
725 PEP_SESSION session, uint16_t value, const char *lang,
726 char **word, size_t *wsize
729 PEP_STATUS status = PEP_STATUS_OK;
735 if (!(session && word && wsize))
736 return PEP_ILLEGAL_VALUE;
744 assert((lang[0] >= 'A' && lang[0] <= 'Z')
745 || (lang[0] >= 'a' && lang[0] <= 'z'));
746 assert((lang[1] >= 'A' && lang[1] <= 'Z')
747 || (lang[1] >= 'a' && lang[1] <= 'z'));
748 assert(lang[2] == 0);
750 sqlite3_reset(session->trustword);
751 sqlite3_bind_text(session->trustword, 1, lang, -1, SQLITE_STATIC);
752 sqlite3_bind_int(session->trustword, 2, value);
754 const int result = sqlite3_step(session->trustword);
755 if (result == SQLITE_ROW) {
756 *word = strdup((const char *) sqlite3_column_text(session->trustword,
759 *wsize = sqlite3_column_bytes(session->trustword, 1);
761 status = PEP_OUT_OF_MEMORY;
763 status = PEP_TRUSTWORD_NOT_FOUND;
765 sqlite3_reset(session->trustword);
769 DYNAMIC_API PEP_STATUS trustwords(
770 PEP_SESSION session, const char *fingerprint, const char *lang,
771 char **words, size_t *wsize, int max_words
774 const char *source = fingerprint;
783 assert(max_words >= 0);
785 if (!(session && fingerprint && words && wsize && max_words >= 0))
786 return PEP_ILLEGAL_VALUE;
791 buffer = calloc(1, MAX_TRUSTWORDS_SPACE);
794 return PEP_OUT_OF_MEMORY;
797 fsize = strlen(fingerprint);
799 if (!lang || !lang[0])
802 assert((lang[0] >= 'A' && lang[0] <= 'Z')
803 || (lang[0] >= 'a' && lang[0] <= 'z'));
804 assert((lang[1] >= 'A' && lang[1] <= 'Z')
805 || (lang[1] >= 'a' && lang[1] <= 'z'));
806 assert(lang[2] == 0);
809 while (source < fingerprint + fsize) {
816 for (value=0, j=0; j < 4 && source < fingerprint + fsize; ) {
817 if (*source >= 'a' && *source <= 'f')
818 value += (*source - 'a' + 10) << (3 - j++) * 4;
819 else if (*source >= 'A' && *source <= 'F')
820 value += (*source - 'A' + 10) << (3 - j++) * 4;
821 else if (*source >= '0' && *source <= '9')
822 value += (*source - '0') << (3 - j++) * 4;
827 _status = trustword(session, value, lang, &word, &_wsize);
828 if (_status == PEP_OUT_OF_MEMORY) {
830 return PEP_OUT_OF_MEMORY;
834 return PEP_TRUSTWORD_NOT_FOUND;
837 if (dest + _wsize < buffer + MAX_TRUSTWORDS_SPACE - 1) {
838 strncpy(dest, word, _wsize);
844 break; // buffer full
847 if (source < fingerprint + fsize
848 && dest + _wsize < buffer + MAX_TRUSTWORDS_SPACE - 1)
852 if (max_words && n_words >= max_words)
857 *wsize = dest - buffer;
858 return PEP_STATUS_OK;
861 pEp_identity *new_identity(
862 const char *address, const char *fpr, const char *user_id,
866 pEp_identity *result = calloc(1, sizeof(pEp_identity));
870 result->address = strdup(address);
871 assert(result->address);
872 if (result->address == NULL) {
878 result->fpr = strdup(fpr);
880 if (result->fpr == NULL) {
881 free_identity(result);
886 result->user_id = strdup(user_id);
887 assert(result->user_id);
888 if (result->user_id == NULL) {
889 free_identity(result);
894 result->username = strdup(username);
895 assert(result->username);
896 if (result->username == NULL) {
897 free_identity(result);
905 pEp_identity *identity_dup(const pEp_identity *src)
909 pEp_identity *dup = new_identity(src->address, src->fpr, src->user_id,
915 dup->comm_type = src->comm_type;
916 dup->lang[0] = src->lang[0];
917 dup->lang[1] = src->lang[1];
920 dup->flags = src->flags;
925 void free_identity(pEp_identity *identity)
928 free(identity->address);
930 free(identity->user_id);
931 free(identity->username);
936 DYNAMIC_API PEP_STATUS get_identity(
940 pEp_identity **identity
943 PEP_STATUS status = PEP_STATUS_OK;
944 static pEp_identity *_identity;
951 if (!(session && address && address[0] && identity))
952 return PEP_ILLEGAL_VALUE;
956 sqlite3_reset(session->get_identity);
957 sqlite3_bind_text(session->get_identity, 1, address, -1, SQLITE_STATIC);
958 sqlite3_bind_text(session->get_identity, 2, user_id, -1, SQLITE_STATIC);
960 const int result = sqlite3_step(session->get_identity);
963 _identity = new_identity(
965 (const char *) sqlite3_column_text(session->get_identity, 0),
967 (const char *) sqlite3_column_text(session->get_identity, 1)
970 if (_identity == NULL)
971 return PEP_OUT_OF_MEMORY;
973 _identity->comm_type = (PEP_comm_type)
974 sqlite3_column_int(session->get_identity, 2);
975 const char* const _lang = (const char *)
976 sqlite3_column_text(session->get_identity, 3);
977 if (_lang && _lang[0]) {
978 assert(_lang[0] >= 'a' && _lang[0] <= 'z');
979 assert(_lang[1] >= 'a' && _lang[1] <= 'z');
980 assert(_lang[2] == 0);
981 _identity->lang[0] = _lang[0];
982 _identity->lang[1] = _lang[1];
983 _identity->lang[2] = 0;
985 _identity->flags = (unsigned int)
986 sqlite3_column_int(session->get_identity, 4);
987 *identity = _identity;
990 status = PEP_CANNOT_FIND_IDENTITY;
994 sqlite3_reset(session->get_identity);
998 DYNAMIC_API PEP_STATUS set_identity(
999 PEP_SESSION session, const pEp_identity *identity
1006 assert(identity->address);
1007 assert(identity->fpr);
1008 assert(identity->user_id);
1009 assert(identity->username);
1011 if (!(session && identity && identity->address && identity->fpr &&
1012 identity->user_id && identity->username))
1013 return PEP_ILLEGAL_VALUE;
1016 PEP_STATUS status = blacklist_is_listed(session, identity->fpr, &listed);
1017 assert(status == PEP_STATUS_OK);
1018 if (status != PEP_STATUS_OK)
1022 return PEP_KEY_BLACKLISTED;
1024 sqlite3_exec(session->db, "BEGIN ;", NULL, NULL, NULL);
1026 if (identity->lang[0]) {
1027 assert(identity->lang[0] >= 'a' && identity->lang[0] <= 'z');
1028 assert(identity->lang[1] >= 'a' && identity->lang[1] <= 'z');
1029 assert(identity->lang[2] == 0);
1032 sqlite3_reset(session->set_person);
1033 sqlite3_bind_text(session->set_person, 1, identity->user_id, -1,
1035 sqlite3_bind_text(session->set_person, 2, identity->username, -1,
1037 if (identity->lang[0])
1038 sqlite3_bind_text(session->set_person, 3, identity->lang, 2,
1041 sqlite3_bind_null(session->set_person, 3);
1042 sqlite3_bind_text(session->set_person, 4, identity->fpr, -1,
1044 result = sqlite3_step(session->set_person);
1045 sqlite3_reset(session->set_person);
1046 if (result != SQLITE_DONE) {
1047 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1048 return PEP_CANNOT_SET_PERSON;
1051 sqlite3_reset(session->set_pgp_keypair);
1052 sqlite3_bind_text(session->set_pgp_keypair, 1, identity->fpr, -1,
1054 result = sqlite3_step(session->set_pgp_keypair);
1055 sqlite3_reset(session->set_pgp_keypair);
1056 if (result != SQLITE_DONE) {
1057 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1058 return PEP_CANNOT_SET_PGP_KEYPAIR;
1061 sqlite3_reset(session->set_identity);
1062 sqlite3_bind_text(session->set_identity, 1, identity->address, -1,
1064 sqlite3_bind_text(session->set_identity, 2, identity->fpr, -1,
1066 sqlite3_bind_text(session->set_identity, 3, identity->user_id, -1,
1068 sqlite3_bind_int(session->set_identity, 4, identity->flags);
1069 result = sqlite3_step(session->set_identity);
1070 sqlite3_reset(session->set_identity);
1071 if (result != SQLITE_DONE) {
1072 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1073 return PEP_CANNOT_SET_IDENTITY;
1076 sqlite3_reset(session->set_trust);
1077 sqlite3_bind_text(session->set_trust, 1, identity->user_id, -1,
1079 sqlite3_bind_text(session->set_trust, 2, identity->fpr, -1,
1081 sqlite3_bind_int(session->set_trust, 3, identity->comm_type);
1082 result = sqlite3_step(session->set_trust);
1083 sqlite3_reset(session->set_trust);
1084 if (result != SQLITE_DONE) {
1085 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1086 return PEP_CANNOT_SET_TRUST;
1089 result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
1090 if (result == SQLITE_OK)
1091 return PEP_STATUS_OK;
1093 return PEP_COMMIT_FAILED;
1096 DYNAMIC_API PEP_STATUS set_device_group(
1097 PEP_SESSION session,
1098 const char *group_name
1106 if (!(session && group_name))
1107 return PEP_ILLEGAL_VALUE;
1109 sqlite3_reset(session->set_device_group);
1110 sqlite3_bind_text(session->set_device_group, 1, group_name, -1,
1112 result = sqlite3_step(session->set_device_group);
1113 sqlite3_reset(session->set_device_group);
1114 if (result != SQLITE_DONE)
1115 return PEP_CANNOT_SET_PERSON;
1117 return PEP_STATUS_OK;
1120 DYNAMIC_API PEP_STATUS get_device_group(PEP_SESSION session, char **group_name)
1122 PEP_STATUS status = PEP_STATUS_OK;
1128 if (!(session && group_name))
1129 return PEP_ILLEGAL_VALUE;
1131 sqlite3_reset(session->get_device_group);
1133 result = sqlite3_step(session->get_device_group);
1136 *group_name = strdup(
1137 (const char *) sqlite3_column_text(session->get_device_group, 0));
1138 if(*group_name == NULL)
1139 status = PEP_OUT_OF_MEMORY;
1144 status = PEP_RECORD_NOT_FOUND;
1147 sqlite3_reset(session->get_device_group);
1151 DYNAMIC_API PEP_STATUS set_identity_flags(
1152 PEP_SESSION session,
1153 pEp_identity *identity,
1161 assert(identity->address);
1162 assert(identity->user_id);
1164 if (!(session && identity && identity->address && identity->user_id))
1165 return PEP_ILLEGAL_VALUE;
1167 sqlite3_reset(session->set_identity_flags);
1168 sqlite3_bind_int(session->set_identity_flags, 1, flags);
1169 sqlite3_bind_text(session->set_identity_flags, 2, identity->address, -1,
1171 sqlite3_bind_text(session->set_identity_flags, 3, identity->user_id, -1,
1173 result = sqlite3_step(session->set_identity_flags);
1174 sqlite3_reset(session->set_identity_flags);
1175 if (result != SQLITE_DONE)
1176 return PEP_CANNOT_SET_IDENTITY;
1178 identity->flags = flags;
1179 return PEP_STATUS_OK;
1182 DYNAMIC_API PEP_STATUS mark_as_compromized(
1183 PEP_SESSION session,
1190 assert(fpr && fpr[0]);
1192 if (!(session && fpr && fpr[0]))
1193 return PEP_ILLEGAL_VALUE;
1195 sqlite3_reset(session->mark_compromized);
1196 sqlite3_bind_text(session->mark_compromized, 1, fpr, -1,
1198 result = sqlite3_step(session->mark_compromized);
1199 sqlite3_reset(session->mark_compromized);
1201 if (result != SQLITE_DONE)
1202 return PEP_CANNOT_SET_TRUST;
1204 return PEP_STATUS_OK;
1207 void pEp_free(void *p)
1212 DYNAMIC_API PEP_STATUS get_trust(PEP_SESSION session, pEp_identity *identity)
1214 PEP_STATUS status = PEP_STATUS_OK;
1219 assert(identity->user_id);
1220 assert(identity->user_id[0]);
1221 assert(identity->fpr);
1222 assert(identity->fpr[0]);
1224 if (!(session && identity && identity->user_id && identity->user_id[0] &&
1225 identity->fpr && identity->fpr[0]))
1226 return PEP_ILLEGAL_VALUE;
1228 identity->comm_type = PEP_ct_unknown;
1230 sqlite3_reset(session->get_trust);
1231 sqlite3_bind_text(session->get_trust, 1, identity->user_id, -1,
1233 sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
1235 result = sqlite3_step(session->get_trust);
1238 int comm_type = (PEP_comm_type) sqlite3_column_int(session->get_trust,
1240 identity->comm_type = comm_type;
1245 status = PEP_CANNOT_FIND_IDENTITY;
1248 sqlite3_reset(session->get_trust);
1252 DYNAMIC_API PEP_STATUS least_trust(
1253 PEP_SESSION session,
1255 PEP_comm_type *comm_type
1258 PEP_STATUS status = PEP_STATUS_OK;
1265 if (!(session && fpr && comm_type))
1266 return PEP_ILLEGAL_VALUE;
1268 *comm_type = PEP_ct_unknown;
1270 sqlite3_reset(session->least_trust);
1271 sqlite3_bind_text(session->least_trust, 1, fpr, -1, SQLITE_STATIC);
1273 result = sqlite3_step(session->least_trust);
1276 int _comm_type = sqlite3_column_int(session->least_trust, 0);
1277 *comm_type = (PEP_comm_type) _comm_type;
1281 status = PEP_CANNOT_FIND_IDENTITY;
1284 sqlite3_reset(session->least_trust);
1288 DYNAMIC_API PEP_STATUS decrypt_and_verify(
1289 PEP_SESSION session, const char *ctext, size_t csize,
1290 char **ptext, size_t *psize, stringlist_t **keylist
1300 if (!(session && ctext && csize && ptext && psize && keylist))
1301 return PEP_ILLEGAL_VALUE;
1303 return session->cryptotech[PEP_crypt_OpenPGP].decrypt_and_verify(
1304 session, ctext, csize, ptext, psize, keylist);
1307 DYNAMIC_API PEP_STATUS encrypt_and_sign(
1308 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
1309 size_t psize, char **ctext, size_t *csize
1319 if (!(session && keylist && ptext && psize && ctext && csize))
1320 return PEP_ILLEGAL_VALUE;
1322 return session->cryptotech[PEP_crypt_OpenPGP].encrypt_and_sign(session,
1323 keylist, ptext, psize, ctext, csize);
1326 DYNAMIC_API PEP_STATUS verify_text(
1327 PEP_SESSION session, const char *text, size_t size,
1328 const char *signature, size_t sig_size, stringlist_t **keylist
1338 if (!(session && text && size && signature && sig_size && keylist))
1339 return PEP_ILLEGAL_VALUE;
1341 return session->cryptotech[PEP_crypt_OpenPGP].verify_text(session, text,
1342 size, signature, sig_size, keylist);
1345 DYNAMIC_API PEP_STATUS delete_keypair(PEP_SESSION session, const char *fpr)
1350 if (!(session && fpr))
1351 return PEP_ILLEGAL_VALUE;
1353 return session->cryptotech[PEP_crypt_OpenPGP].delete_keypair(session, fpr);
1356 DYNAMIC_API PEP_STATUS export_key(
1357 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
1365 if (!(session && fpr && key_data && size))
1366 return PEP_ILLEGAL_VALUE;
1368 return session->cryptotech[PEP_crypt_OpenPGP].export_key(session, fpr,
1369 key_data, size, false);
1372 DYNAMIC_API PEP_STATUS export_secrect_key(
1373 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
1381 if (!(session && fpr && key_data && size))
1382 return PEP_ILLEGAL_VALUE;
1384 // don't accept key IDs but full fingerprints only
1385 if (strlen(fpr) < 16)
1386 return PEP_ILLEGAL_VALUE;
1388 return session->cryptotech[PEP_crypt_OpenPGP].export_key(session, fpr,
1389 key_data, size, true);
1392 DYNAMIC_API PEP_STATUS find_keys(
1393 PEP_SESSION session, const char *pattern, stringlist_t **keylist
1400 if (!(session && pattern && keylist))
1401 return PEP_ILLEGAL_VALUE;
1403 return session->cryptotech[PEP_crypt_OpenPGP].find_keys(session, pattern,
1408 DYNAMIC_API PEP_STATUS generate_keypair(
1409 PEP_SESSION session, pEp_identity *identity
1414 assert(identity->address);
1415 assert(identity->fpr == NULL || identity->fpr[0] == 0);
1416 assert(identity->username);
1418 if (!(session && identity && identity->address &&
1419 (identity->fpr == NULL || identity->fpr[0] == 0) &&
1420 identity->username))
1421 return PEP_ILLEGAL_VALUE;
1424 session->cryptotech[PEP_crypt_OpenPGP].generate_keypair(session,
1426 if (status != PEP_STATUS_OK)
1432 DYNAMIC_API PEP_STATUS get_key_rating(
1433 PEP_SESSION session,
1435 PEP_comm_type *comm_type
1442 if (!(session && fpr && comm_type))
1443 return PEP_ILLEGAL_VALUE;
1445 return session->cryptotech[PEP_crypt_OpenPGP].get_key_rating(session, fpr,
1449 DYNAMIC_API PEP_STATUS import_key(
1450 PEP_SESSION session,
1451 const char *key_data,
1453 identity_list **private_keys
1459 if (!(session && key_data))
1460 return PEP_ILLEGAL_VALUE;
1462 return session->cryptotech[PEP_crypt_OpenPGP].import_key(session, key_data,
1463 size, private_keys);
1466 DYNAMIC_API PEP_STATUS recv_key(PEP_SESSION session, const char *pattern)
1471 if (!(session && pattern))
1472 return PEP_ILLEGAL_VALUE;
1474 return session->cryptotech[PEP_crypt_OpenPGP].recv_key(session, pattern);
1477 DYNAMIC_API PEP_STATUS send_key(PEP_SESSION session, const char *pattern)
1482 if (!(session && pattern))
1483 return PEP_ILLEGAL_VALUE;
1485 return session->cryptotech[PEP_crypt_OpenPGP].send_key(session, pattern);
1488 DYNAMIC_API PEP_STATUS renew_key(
1489 PEP_SESSION session,
1497 if (!(session && fpr))
1498 return PEP_ILLEGAL_VALUE;
1500 return session->cryptotech[PEP_crypt_OpenPGP].renew_key(session, fpr, ts);
1503 DYNAMIC_API PEP_STATUS revoke_key(
1504 PEP_SESSION session,
1512 if (!(session && fpr))
1513 return PEP_ILLEGAL_VALUE;
1515 return session->cryptotech[PEP_crypt_OpenPGP].revoke_key(session, fpr,
1519 DYNAMIC_API PEP_STATUS key_expired(
1520 PEP_SESSION session,
1530 if (!(session && fpr && expired))
1531 return PEP_ILLEGAL_VALUE;
1533 return session->cryptotech[PEP_crypt_OpenPGP].key_expired(session, fpr,
1537 DYNAMIC_API PEP_STATUS key_revoked(
1538 PEP_SESSION session,
1547 if (!(session && fpr && revoked))
1548 return PEP_ILLEGAL_VALUE;
1550 return session->cryptotech[PEP_crypt_OpenPGP].key_revoked(session, fpr,
1554 static void _clean_log_value(char *text)
1557 for (char *c = text; *c; c++) {
1558 if (*c < 32 && *c != '\n')
1566 static char *_concat_string(char *str1, const char *str2, char delim)
1568 str2 = str2 ? str2 : "";
1569 size_t len1 = str1 ? strlen(str1) : 0;
1570 size_t len2 = strlen(str2);
1571 size_t len = len1 + len2 + 3;
1572 char * result = realloc(str1, len + 1);
1576 strcpy(result + len1 + 1, str2);
1577 result[len - 2] = '"';
1578 result[len - 1] = delim;
1588 DYNAMIC_API PEP_STATUS get_crashdump_log(
1589 PEP_SESSION session,
1594 PEP_STATUS status = PEP_STATUS_OK;
1595 char *_logdata= NULL;
1598 assert(maxlines >= 0 && maxlines <= CRASHDUMP_MAX_LINES);
1601 if (!(session && logdata && maxlines >= 0 && maxlines <=
1602 CRASHDUMP_MAX_LINES))
1603 return PEP_ILLEGAL_VALUE;
1607 int limit = maxlines ? maxlines : CRASHDUMP_DEFAULT_LINES;
1608 const char *timestamp = NULL;
1609 const char *title = NULL;
1610 const char *entity = NULL;
1611 const char *desc = NULL;
1612 const char *comment = NULL;
1614 sqlite3_reset(session->crashdump);
1615 sqlite3_bind_int(session->crashdump, 1, limit);
1620 result = sqlite3_step(session->crashdump);
1623 timestamp = (const char *) sqlite3_column_text(session->crashdump,
1625 title = (const char *) sqlite3_column_text(session->crashdump,
1627 entity = (const char *) sqlite3_column_text(session->crashdump,
1629 desc = (const char *) sqlite3_column_text(session->crashdump,
1631 comment = (const char *) sqlite3_column_text(session->crashdump,
1634 _logdata = _concat_string(_logdata, timestamp, ',');
1635 if (_logdata == NULL)
1638 _logdata = _concat_string(_logdata, title, ',');
1639 if (_logdata == NULL)
1642 _logdata = _concat_string(_logdata, entity, ',');
1643 if (_logdata == NULL)
1646 _logdata = _concat_string(_logdata, desc, ',');
1647 if (_logdata == NULL)
1650 _logdata = _concat_string(_logdata, comment, '\n');
1651 if (_logdata == NULL)
1654 _clean_log_value(_logdata);
1661 status = PEP_UNKNOWN_ERROR;
1662 result = SQLITE_DONE;
1664 } while (result != SQLITE_DONE);
1666 sqlite3_reset(session->crashdump);
1667 if (status == PEP_STATUS_OK)
1668 *logdata = _logdata;
1673 status = PEP_OUT_OF_MEMORY;
1679 DYNAMIC_API PEP_STATUS get_languagelist(
1680 PEP_SESSION session,
1684 PEP_STATUS status = PEP_STATUS_OK;
1685 char *_languages= NULL;
1690 if (!(session && languages))
1691 return PEP_ILLEGAL_VALUE;
1695 const char *lang = NULL;
1696 const char *name = NULL;
1697 const char *phrase = NULL;
1699 sqlite3_reset(session->languagelist);
1704 result = sqlite3_step(session->languagelist);
1707 lang = (const char *) sqlite3_column_text(session->languagelist,
1709 name = (const char *) sqlite3_column_text(session->languagelist,
1711 phrase = (const char *) sqlite3_column_text(session->languagelist,
1714 _languages = _concat_string(_languages, lang, ',');
1715 if (_languages == NULL)
1718 _languages = _concat_string(_languages, name, ',');
1719 if (_languages == NULL)
1722 _languages = _concat_string(_languages, phrase, '\n');
1723 if (_languages == NULL)
1732 status = PEP_UNKNOWN_ERROR;
1733 result = SQLITE_DONE;
1735 } while (result != SQLITE_DONE);
1737 sqlite3_reset(session->languagelist);
1738 if (status == PEP_STATUS_OK)
1739 *languages = _languages;
1744 status = PEP_OUT_OF_MEMORY;
1750 DYNAMIC_API PEP_STATUS get_phrase(
1751 PEP_SESSION session,
1757 PEP_STATUS status = PEP_STATUS_OK;
1759 assert(session && lang && lang[0] && lang[1] && lang[2] == 0 && phrase);
1760 if (!(session && lang && lang[0] && lang[1] && lang[2] == 0 && phrase))
1761 return PEP_ILLEGAL_VALUE;
1765 sqlite3_reset(session->i18n_token);
1766 sqlite3_bind_text(session->i18n_token, 1, lang, -1, SQLITE_STATIC);
1767 sqlite3_bind_int(session->i18n_token, 2, phrase_id);
1769 const char *_phrase = NULL;
1772 result = sqlite3_step(session->i18n_token);
1775 _phrase = (const char *) sqlite3_column_text(session->i18n_token, 0);
1779 status = PEP_PHRASE_NOT_FOUND;
1783 status = PEP_UNKNOWN_ERROR;
1786 if (status == PEP_STATUS_OK) {
1787 *phrase = strdup(_phrase);
1788 if (*phrase == NULL)
1792 sqlite3_reset(session->i18n_token);
1796 status = PEP_OUT_OF_MEMORY;
1802 static PEP_STATUS _get_sequence_value(PEP_SESSION session, const char *name,
1805 assert(session && name && value);
1806 if (!(session && name && value))
1807 return PEP_ILLEGAL_VALUE;
1809 PEP_STATUS status = PEP_STATUS_OK;
1811 sqlite3_reset(session->sequence_value2);
1812 sqlite3_bind_text(session->sequence_value2, 1, name, -1,
1814 int result = sqlite3_step(session->sequence_value2);
1817 int32_t _value = (int32_t)
1818 sqlite3_column_int(session->sequence_value2, 0);
1820 sqlite3_column_int(session->sequence_value2, 1);
1823 status = PEP_OWN_SEQUENCE;
1827 status = PEP_RECORD_NOT_FOUND;
1830 status = PEP_UNKNOWN_ERROR;
1832 sqlite3_reset(session->sequence_value2);
1837 static PEP_STATUS _increment_sequence_value(PEP_SESSION session,
1838 const char *name, int own)
1840 assert(session && name);
1841 if (!(session && name))
1842 return PEP_ILLEGAL_VALUE;
1844 sqlite3_reset(session->sequence_value1);
1845 sqlite3_bind_text(session->sequence_value1, 1, name, -1, SQLITE_STATIC);
1846 sqlite3_bind_int(session->sequence_value1, 2, own);
1847 int result = sqlite3_step(session->sequence_value1);
1848 assert(result == SQLITE_DONE);
1849 sqlite3_reset(session->sequence_value1);
1850 if (result == SQLITE_DONE)
1851 return PEP_STATUS_OK;
1853 return PEP_CANNOT_INCREASE_SEQUENCE;
1856 static PEP_STATUS _set_sequence_value(PEP_SESSION session,
1857 const char *name, int32_t value, int own)
1859 assert(session && name && value > 0);
1860 if (!(session && name && value > 0))
1861 return PEP_ILLEGAL_VALUE;
1863 sqlite3_reset(session->sequence_value3);
1864 sqlite3_bind_text(session->sequence_value3, 1, name, -1, SQLITE_STATIC);
1865 sqlite3_bind_int(session->sequence_value3, 2, value);
1866 sqlite3_bind_int(session->sequence_value3, 3, own);
1867 int result = sqlite3_step(session->sequence_value3);
1868 assert(result == SQLITE_DONE);
1869 sqlite3_reset(session->sequence_value3);
1870 if (result == SQLITE_DONE)
1871 return PEP_STATUS_OK;
1873 return PEP_CANNOT_SET_SEQUENCE_VALUE;
1876 DYNAMIC_API PEP_STATUS sequence_value(
1877 PEP_SESSION session,
1882 PEP_STATUS status = PEP_STATUS_OK;
1885 assert(name && value && *value >= 0);
1887 if (!(session && name && value && *value >= 0))
1888 return PEP_ILLEGAL_VALUE;
1892 unsigned char uuid[16];
1893 uuid_generate_random(uuid);
1894 uuid_unparse_upper(uuid, name);
1898 if (name == session->sync_uuid || strcmp(name, session->sync_uuid) == 0)
1903 int32_t old_value = 0;
1904 status = _get_sequence_value(session, name, &old_value);
1905 if (status != PEP_STATUS_OK && status != PEP_RECORD_NOT_FOUND)
1908 if (old_value >= *value) {
1909 return PEP_SEQUENCE_VIOLATED;
1912 status = _set_sequence_value(session, name, *value, own);
1917 assert(*value == 0);
1918 status = _increment_sequence_value(session, name, own);
1919 if (status == PEP_STATUS_OK) {
1920 status = _get_sequence_value(session, name, value);
1921 assert(*value < INT32_MAX);
1922 if (*value == INT32_MAX)
1923 return PEP_CANNOT_INCREASE_SEQUENCE;
1928 DYNAMIC_API PEP_STATUS set_revoked(
1929 PEP_SESSION session,
1930 const char *revoked_fpr,
1931 const char *replacement_fpr,
1932 const uint64_t revocation_date
1935 PEP_STATUS status = PEP_STATUS_OK;
1938 revoked_fpr && revoked_fpr[0] &&
1939 replacement_fpr && replacement_fpr[0]
1943 revoked_fpr && revoked_fpr[0] &&
1944 replacement_fpr && replacement_fpr[0]
1946 return PEP_ILLEGAL_VALUE;
1948 sqlite3_reset(session->set_revoked);
1949 sqlite3_bind_text(session->set_revoked, 1, revoked_fpr, -1, SQLITE_STATIC);
1950 sqlite3_bind_text(session->set_revoked, 2, replacement_fpr, -1,
1952 sqlite3_bind_int64(session->set_revoked, 3, revocation_date);
1956 result = sqlite3_step(session->set_revoked);
1959 status = PEP_STATUS_OK;
1963 status = PEP_UNKNOWN_ERROR;
1966 sqlite3_reset(session->set_revoked);
1970 DYNAMIC_API PEP_STATUS get_revoked(
1971 PEP_SESSION session,
1974 uint64_t *revocation_date
1977 PEP_STATUS status = PEP_STATUS_OK;
1988 return PEP_ILLEGAL_VALUE;
1990 *revoked_fpr = NULL;
1991 *revocation_date = 0;
1993 sqlite3_reset(session->get_revoked);
1994 sqlite3_bind_text(session->get_revoked, 1, fpr, -1, SQLITE_STATIC);
1998 result = sqlite3_step(session->get_revoked);
2001 *revoked_fpr = strdup((const char *)
2002 sqlite3_column_text(session->get_revoked, 0));
2004 *revocation_date = sqlite3_column_int64(session->get_revoked,
2007 status = PEP_OUT_OF_MEMORY;
2012 status = PEP_CANNOT_FIND_IDENTITY;
2015 sqlite3_reset(session->get_revoked);
2020 PEP_STATUS key_created(
2021 PEP_SESSION session,
2026 assert(session && fpr && created);
2027 if (!(session && fpr && created))
2028 return PEP_ILLEGAL_VALUE;
2030 return session->cryptotech[PEP_crypt_OpenPGP].key_created(session, fpr,
2034 DYNAMIC_API const char* get_engine_version() {
2035 return PEP_ENGINE_VERSION;
2039 DYNAMIC_API PEP_STATUS reset_peptest_hack(PEP_SESSION session)
2044 return PEP_ILLEGAL_VALUE;
2046 int int_result = sqlite3_exec(
2048 "delete from identity where address like '%@peptest.ch' ;",
2053 assert(int_result == SQLITE_OK);
2055 return PEP_STATUS_OK;