1 #include "pEp_internal.h"
2 #include "dynamic_api.h"
3 #include "cryptotech.h"
8 static int init_count = -1;
11 static int user_version(void *_version, int count, char **text, char **name)
15 assert(text && text[0]);
16 if (!(_version && count == 1 && text && text[0]))
19 int *version = (int *) _version;
20 *version = atoi(text[0]);
24 DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
26 PEP_STATUS status = PEP_STATUS_OK;
28 static const char *sql_log;
29 static const char *sql_trustword;
30 static const char *sql_get_identity;
31 static const char *sql_set_person;
32 static const char *sql_set_device_group;
33 static const char *sql_get_device_group;
34 static const char *sql_set_pgp_keypair;
35 static const char *sql_set_identity;
36 static const char *sql_set_identity_flags;
37 static const char *sql_set_trust;
38 static const char *sql_get_trust;
39 static const char *sql_least_trust;
40 static const char *sql_mark_as_compromized;
41 static const char *sql_crashdump;
42 static const char *sql_languagelist;
43 static const char *sql_i18n_token;
46 static const char *sql_blacklist_add;
47 static const char *sql_blacklist_delete;
48 static const char *sql_blacklist_is_listed;
49 static const char *sql_blacklist_retrieve;
52 static const char *sql_own_key_is_listed;
53 static const char *sql_own_identities_retrieve;
56 static const char *sql_sequence_value1;
57 static const char *sql_sequence_value2;
58 static const char *sql_sequence_value3;
60 // Revocation tracking
61 static const char *sql_set_revoked;
62 static const char *sql_get_revoked;
64 bool in_first = false;
66 assert(sqlite3_threadsafe());
67 if (!sqlite3_threadsafe())
68 return PEP_INIT_SQLITE3_WITHOUT_MUTEX;
70 // a little race condition - but still a race condition
71 // mitigated by calling caveat (see documentation)
79 return PEP_ILLEGAL_VALUE;
83 pEpSession *_session = calloc(1, sizeof(pEpSession));
88 _session->version = PEP_ENGINE_VERSION;
91 if (LOCAL_DB == NULL) {
92 status = PEP_INIT_CANNOT_OPEN_DB;
96 int_result = sqlite3_open_v2(
101 | SQLITE_OPEN_FULLMUTEX
102 | SQLITE_OPEN_PRIVATECACHE,
106 if (int_result != SQLITE_OK) {
107 status = PEP_INIT_CANNOT_OPEN_DB;
111 sqlite3_busy_timeout(_session->db, BUSY_WAIT_TIME);
114 if (SYSTEM_DB == NULL) {
115 status = PEP_INIT_CANNOT_OPEN_SYSTEM_DB;
119 int_result = sqlite3_open_v2(
120 SYSTEM_DB, &_session->system_db,
122 | SQLITE_OPEN_FULLMUTEX
123 | SQLITE_OPEN_SHAREDCACHE,
127 if (int_result != SQLITE_OK) {
128 status = PEP_INIT_CANNOT_OPEN_SYSTEM_DB;
132 sqlite3_busy_timeout(_session->system_db, 1000);
134 // increment this when patching DDL
135 #define _DDL_USER_VERSION "3"
138 memset(sync_uuid, 0, 37);
140 int_result = sqlite3_exec(
142 "create table if not exists version_info (\n"
143 " id integer primary key,\n"
144 " timestamp integer default (datetime('now')),\n"
152 int_result = sqlite3_exec(
154 "PRAGMA application_id = 0x23423423;\n"
155 "create table if not exists log (\n"
156 " timestamp integer default (datetime('now')),\n"
157 " title text not null,\n"
158 " entity text not null,\n"
159 " description text,\n"
162 "create index if not exists log_timestamp on log (\n"
165 "create table if not exists pgp_keypair (\n"
166 " fpr text primary key,\n"
167 " public_id text unique,\n"
168 " private_id text,\n"
169 " created integer,\n"
170 " expires integer,\n"
172 " flags integer default 0\n"
174 "create index if not exists pgp_keypair_expires on pgp_keypair (\n"
177 "create table if not exists person (\n"
178 " id text primary key,\n"
179 " username text not null,\n"
180 " main_key_id text\n"
181 " references pgp_keypair (fpr)\n"
182 " on delete set null,\n"
185 " device_group text\n"
187 "create table if not exists identity (\n"
190 " references person (id)\n"
191 " on delete cascade,\n"
192 " main_key_id text\n"
193 " references pgp_keypair (fpr)\n"
194 " on delete set null,\n"
196 " flags integer default 0,"
197 " primary key (address, user_id)\n"
199 "create table if not exists trust (\n"
200 " user_id text not null\n"
201 " references person (id)\n"
202 " on delete cascade,\n"
203 " pgp_keypair_fpr text not null\n"
204 " references pgp_keypair (fpr)\n"
205 " on delete cascade,\n"
206 " comm_type integer not null,\n"
208 " primary key (user_id, pgp_keypair_fpr)\n"
211 "create table if not exists blacklist_keys (\n"
212 " fpr text primary key\n"
215 "create table if not exists sequences(\n"
216 " name text primary key,\n"
217 " value integer default 0,\n"
218 " own integer default 0\n"
220 "create table if not exists revoked_keys (\n"
221 " revoked_fpr text primary key,\n"
222 " replacement_fpr text not null\n"
223 " references pgp_keypair (fpr)\n"
224 " on delete cascade,\n"
225 " revocation_date integer\n"
232 assert(int_result == SQLITE_OK);
235 int_result = sqlite3_exec(
237 "pragma user_version;",
242 assert(int_result == SQLITE_OK);
245 int_result = sqlite3_exec(
247 "alter table identity\n"
248 " add column flags integer default 0;\n",
256 int_result = sqlite3_exec(
258 "alter table pgp_keypair\n"
259 " add column flags integer default 0;\n"
260 "alter table person\n"
261 " add column device_group text;\n",
269 int_result = sqlite3_exec(
271 "alter table sequences\n"
272 " add column own integer default 0;\n",
279 if (version < atoi(_DDL_USER_VERSION)) {
280 int_result = sqlite3_exec(
282 "pragma user_version = "_DDL_USER_VERSION";\n"
283 "insert or replace into version_info (id, version)"
284 "values (1, '" PEP_ENGINE_VERSION "');",
289 assert(int_result == SQLITE_OK);
292 if (version <= atoi(_DDL_USER_VERSION)) {
293 int_result = sqlite3_exec(
295 "pragma user_version = "_DDL_USER_VERSION";\n"
296 "insert or replace into version_info (id, version)"
297 "values (1, '" PEP_ENGINE_VERSION "');",
302 assert(int_result == SQLITE_OK);
305 sql_log = "insert into log (title, entity, description, comment)"
306 "values (?1, ?2, ?3, ?4);";
308 sql_get_identity = "select fpr, username, comm_type, lang,"
309 " identity.flags | pgp_keypair.flags"
311 " join person on id = identity.user_id"
312 " join pgp_keypair on fpr = identity.main_key_id"
313 " join trust on id = trust.user_id"
314 " and pgp_keypair_fpr = identity.main_key_id"
315 " where address = ?1 and identity.user_id = ?2;";
317 sql_trustword = "select id, word from wordlist where lang = lower(?1) "
320 // Set person, but if already exist, only update.
321 // if main_key_id already set, don't touch.
322 sql_set_person = "insert or replace into person (id, username, lang, main_key_id)"
323 " values (?1, ?2, ?3,"
324 " (select coalesce((select main_key_id from person "
325 " where id = ?1), upper(replace(?4,' ',''))))) ;";
327 sql_set_device_group = "update person set device_group = ?1 "
328 "where user_id = '" PEP_OWN_USERID "';";
330 sql_get_device_group = "select device_group from person "
331 "where user_id = '" PEP_OWN_USERID "';";
333 sql_set_pgp_keypair = "insert or replace into pgp_keypair (fpr) "
334 "values (upper(replace(?1,' ',''))) ;";
336 sql_set_identity = "insert or replace into identity (address, main_key_id, "
337 "user_id, flags) values (?1, upper(replace(?2,' ','')),"
340 sql_set_identity_flags = "update identity set flags = ?1 & 255 "
341 "where address = ?2 and user_id = ?3 ;";
343 sql_set_trust = "insert or replace into trust (user_id, pgp_keypair_fpr, comm_type) "
344 "values (?1, upper(replace(?2,' ','')), ?3) ;";
346 sql_get_trust = "select comm_type from trust where user_id = ?1 "
347 "and pgp_keypair_fpr = upper(replace(?2,' ','')) ;";
349 sql_least_trust = "select min(comm_type) from trust where pgp_keypair_fpr = upper(replace(?1,' ','')) ;";
351 sql_mark_as_compromized = "update trust not indexed set comm_type = 15"
352 " where pgp_keypair_fpr = upper(replace(?1,' ','')) ;";
354 sql_crashdump = "select timestamp, title, entity, description, comment"
355 " from log order by timestamp desc limit ?1 ;";
357 sql_languagelist = "select i18n_language.lang, name, phrase from i18n_language join i18n_token using (lang) where i18n_token.id = 1000;" ;
359 sql_i18n_token = "select phrase from i18n_token where lang = lower(?1) and id = ?2 ;";
363 sql_blacklist_add = "insert or replace into blacklist_keys (fpr) values (upper(replace(?1,' ',''))) ;"
364 "delete from identity where main_key_id = upper(replace(?1,' ','')) ;"
365 "delete from pgp_keypair where fpr = upper(replace(?1,' ','')) ;";
367 sql_blacklist_delete = "delete from blacklist_keys where fpr = upper(replace(?1,' ','')) ;";
369 sql_blacklist_is_listed = "select count(*) from blacklist_keys where fpr = upper(replace(?1,' ','')) ;";
371 sql_blacklist_retrieve = "select * from blacklist_keys ;";
375 sql_own_key_is_listed =
376 "select count(*) from ("
377 " select main_key_id from person "
378 " where main_key_id = upper(replace(?1,' ',''))"
379 " and id = '" PEP_OWN_USERID "' "
381 " select main_key_id from identity "
382 " where main_key_id = upper(replace(?1,' ',''))"
383 " and user_id = '" PEP_OWN_USERID "' );";
385 sql_own_identities_retrieve = "select address, fpr, username, "
386 " lang, identity.flags | pgp_keypair.flags"
388 " join person on id = identity.user_id"
389 " join pgp_keypair on fpr = identity.main_key_id"
390 " join trust on id = trust.user_id"
391 " and pgp_keypair_fpr = identity.main_key_id"
392 " where identity.user_id = '" PEP_OWN_USERID "';";
394 sql_sequence_value1 = "insert or replace into sequences (name, value, own) "
396 "(select coalesce((select value + 1 from sequences "
397 "where name = ?1), 1 )), ?2) ; ";
398 sql_sequence_value2 = "select value, own from sequences where name = ?1 ;";
399 sql_sequence_value3 = "update sequences set value = ?2, own = ?3 where name = ?1 ;";
401 sql_set_revoked = "insert or replace into revoked_keys ("
402 " revoked_fpr, replacement_fpr, revocation_date) "
403 "values (upper(replace(?1,' ','')),"
404 " upper(replace(?2,' ','')),"
407 sql_get_revoked = "select revoked_fpr, revocation_date from revoked_keys"
408 " where replacement_fpr = upper(replace(?1,' ','')) ;";
411 int_result = sqlite3_prepare_v2(_session->db, sql_log,
412 (int)strlen(sql_log), &_session->log, NULL);
413 assert(int_result == SQLITE_OK);
415 int_result = sqlite3_prepare_v2(_session->system_db, sql_trustword,
416 (int)strlen(sql_trustword), &_session->trustword, NULL);
417 assert(int_result == SQLITE_OK);
419 int_result = sqlite3_prepare_v2(_session->db, sql_get_identity,
420 (int)strlen(sql_get_identity), &_session->get_identity, NULL);
421 assert(int_result == SQLITE_OK);
423 int_result = sqlite3_prepare_v2(_session->db, sql_set_person,
424 (int)strlen(sql_set_person), &_session->set_person, NULL);
425 assert(int_result == SQLITE_OK);
427 int_result = sqlite3_prepare_v2(_session->db, sql_set_device_group,
428 (int)strlen(sql_set_device_group), &_session->set_device_group, NULL);
429 assert(int_result == SQLITE_OK);
431 int_result = sqlite3_prepare_v2(_session->db, sql_get_device_group,
432 (int)strlen(sql_get_device_group), &_session->get_device_group, NULL);
433 assert(int_result == SQLITE_OK);
435 int_result = sqlite3_prepare_v2(_session->db, sql_set_pgp_keypair,
436 (int)strlen(sql_set_pgp_keypair), &_session->set_pgp_keypair,
438 assert(int_result == SQLITE_OK);
440 int_result = sqlite3_prepare_v2(_session->db, sql_set_identity,
441 (int)strlen(sql_set_identity), &_session->set_identity, NULL);
442 assert(int_result == SQLITE_OK);
444 int_result = sqlite3_prepare_v2(_session->db, sql_set_identity_flags,
445 (int)strlen(sql_set_identity_flags), &_session->set_identity_flags,
447 assert(int_result == SQLITE_OK);
449 int_result = sqlite3_prepare_v2(_session->db, sql_set_trust,
450 (int)strlen(sql_set_trust), &_session->set_trust, NULL);
451 assert(int_result == SQLITE_OK);
453 int_result = sqlite3_prepare_v2(_session->db, sql_get_trust,
454 (int)strlen(sql_get_trust), &_session->get_trust, NULL);
455 assert(int_result == SQLITE_OK);
457 int_result = sqlite3_prepare_v2(_session->db, sql_least_trust,
458 (int)strlen(sql_least_trust), &_session->least_trust, NULL);
459 assert(int_result == SQLITE_OK);
461 int_result = sqlite3_prepare_v2(_session->db, sql_mark_as_compromized,
462 (int)strlen(sql_mark_as_compromized), &_session->mark_compromized,
464 assert(int_result == SQLITE_OK);
466 int_result = sqlite3_prepare_v2(_session->db, sql_crashdump,
467 (int)strlen(sql_crashdump), &_session->crashdump, NULL);
468 assert(int_result == SQLITE_OK);
470 int_result = sqlite3_prepare_v2(_session->system_db, sql_languagelist,
471 (int)strlen(sql_languagelist), &_session->languagelist, NULL);
472 assert(int_result == SQLITE_OK);
474 int_result = sqlite3_prepare_v2(_session->system_db, sql_i18n_token,
475 (int)strlen(sql_i18n_token), &_session->i18n_token, NULL);
476 assert(int_result == SQLITE_OK);
480 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_add,
481 (int)strlen(sql_blacklist_add), &_session->blacklist_add, NULL);
482 assert(int_result == SQLITE_OK);
484 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_delete,
485 (int)strlen(sql_blacklist_delete), &_session->blacklist_delete,
487 assert(int_result == SQLITE_OK);
489 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_is_listed,
490 (int)strlen(sql_blacklist_is_listed),
491 &_session->blacklist_is_listed, NULL);
492 assert(int_result == SQLITE_OK);
494 int_result = sqlite3_prepare_v2(_session->db, sql_blacklist_retrieve,
495 (int)strlen(sql_blacklist_retrieve), &_session->blacklist_retrieve,
497 assert(int_result == SQLITE_OK);
501 int_result = sqlite3_prepare_v2(_session->db, sql_own_key_is_listed,
502 (int)strlen(sql_own_key_is_listed), &_session->own_key_is_listed,
504 assert(int_result == SQLITE_OK);
506 int_result = sqlite3_prepare_v2(_session->db, sql_own_identities_retrieve,
507 (int)strlen(sql_own_identities_retrieve),
508 &_session->own_identities_retrieve, NULL);
509 assert(int_result == SQLITE_OK);
513 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value1,
514 (int)strlen(sql_sequence_value1), &_session->sequence_value1,
516 assert(int_result == SQLITE_OK);
518 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value2,
519 (int)strlen(sql_sequence_value2), &_session->sequence_value2,
521 assert(int_result == SQLITE_OK);
523 int_result = sqlite3_prepare_v2(_session->db, sql_sequence_value3,
524 (int)strlen(sql_sequence_value3), &_session->sequence_value3,
526 assert(int_result == SQLITE_OK);
528 // Revocation tracking
530 int_result = sqlite3_prepare_v2(_session->db, sql_set_revoked,
531 (int)strlen(sql_set_revoked), &_session->set_revoked, NULL);
532 assert(int_result == SQLITE_OK);
534 int_result = sqlite3_prepare_v2(_session->db, sql_get_revoked,
535 (int)strlen(sql_get_revoked), &_session->get_revoked, NULL);
536 assert(int_result == SQLITE_OK);
538 status = init_cryptotech(_session, in_first);
539 if (status != PEP_STATUS_OK)
542 status = init_transport_system(_session, in_first);
543 if (status != PEP_STATUS_OK)
546 status = log_event(_session, "init", "pEp " PEP_ENGINE_VERSION, NULL, NULL);
547 if (status != PEP_STATUS_OK)
553 _session->use_only_own_private_keys = true;
554 #elif TARGET_OS_IPHONE
555 _session->use_only_own_private_keys = true;
557 _session->use_only_own_private_keys = false;
561 return PEP_STATUS_OK;
564 status = PEP_OUT_OF_MEMORY;
571 DYNAMIC_API void release(PEP_SESSION session)
573 bool out_last = false;
575 assert(init_count >= 0);
578 if (!((init_count >= 0) && session))
581 // a small race condition but still a race condition
582 // mitigated by calling caveat (see documentation)
589 if (session->sync_state != DeviceState_state_NONE)
590 unregister_sync_callbacks(session);
594 sqlite3_finalize(session->log);
595 if (session->trustword)
596 sqlite3_finalize(session->trustword);
597 if (session->get_identity)
598 sqlite3_finalize(session->get_identity);
599 if (session->set_person)
600 sqlite3_finalize(session->set_person);
601 if (session->set_device_group)
602 sqlite3_finalize(session->set_device_group);
603 if (session->get_device_group)
604 sqlite3_finalize(session->get_device_group);
605 if (session->set_pgp_keypair)
606 sqlite3_finalize(session->set_pgp_keypair);
607 if (session->set_identity)
608 sqlite3_finalize(session->set_identity);
609 if (session->set_identity_flags)
610 sqlite3_finalize(session->set_identity_flags);
611 if (session->set_trust)
612 sqlite3_finalize(session->set_trust);
613 if (session->get_trust)
614 sqlite3_finalize(session->get_trust);
615 if (session->least_trust)
616 sqlite3_finalize(session->least_trust);
617 if (session->mark_compromized)
618 sqlite3_finalize(session->mark_compromized);
619 if (session->crashdump)
620 sqlite3_finalize(session->crashdump);
621 if (session->languagelist)
622 sqlite3_finalize(session->languagelist);
623 if (session->i18n_token)
624 sqlite3_finalize(session->i18n_token);
625 if (session->blacklist_add)
626 sqlite3_finalize(session->blacklist_add);
627 if (session->blacklist_delete)
628 sqlite3_finalize(session->blacklist_delete);
629 if (session->blacklist_is_listed)
630 sqlite3_finalize(session->blacklist_is_listed);
631 if (session->blacklist_retrieve)
632 sqlite3_finalize(session->blacklist_retrieve);
633 if (session->own_key_is_listed)
634 sqlite3_finalize(session->own_key_is_listed);
635 if (session->own_identities_retrieve)
636 sqlite3_finalize(session->own_identities_retrieve);
637 if (session->sequence_value1)
638 sqlite3_finalize(session->sequence_value1);
639 if (session->sequence_value2)
640 sqlite3_finalize(session->sequence_value2);
641 if (session->sequence_value3)
642 sqlite3_finalize(session->sequence_value3);
643 if (session->set_revoked)
644 sqlite3_finalize(session->set_revoked);
645 if (session->get_revoked)
646 sqlite3_finalize(session->get_revoked);
649 sqlite3_close_v2(session->db);
650 if (session->system_db)
651 sqlite3_close_v2(session->system_db);
654 release_transport_system(session, out_last);
655 release_cryptotech(session, out_last);
661 DYNAMIC_API void config_passive_mode(PEP_SESSION session, bool enable)
664 session->passive_mode = enable;
667 DYNAMIC_API void config_unencrypted_subject(PEP_SESSION session, bool enable)
670 session->unencrypted_subject = enable;
673 DYNAMIC_API void config_use_only_own_private_keys(PEP_SESSION session,
677 session->use_only_own_private_keys = enable;
680 DYNAMIC_API void config_keep_sync_msg(PEP_SESSION session, bool enable)
683 session->keep_sync_msg = enable;
686 DYNAMIC_API PEP_STATUS log_event(
690 const char *description,
694 PEP_STATUS status = PEP_STATUS_OK;
701 if (!(session && title && entity))
702 return PEP_ILLEGAL_VALUE;
704 sqlite3_reset(session->log);
705 sqlite3_bind_text(session->log, 1, title, -1, SQLITE_STATIC);
706 sqlite3_bind_text(session->log, 2, entity, -1, SQLITE_STATIC);
708 sqlite3_bind_text(session->log, 3, description, -1, SQLITE_STATIC);
710 sqlite3_bind_null(session->log, 3);
712 sqlite3_bind_text(session->log, 4, comment, -1, SQLITE_STATIC);
714 sqlite3_bind_null(session->log, 4);
716 result = sqlite3_step(session->log);
717 assert(result == SQLITE_DONE || result == SQLITE_BUSY);
718 if (result != SQLITE_DONE && result != SQLITE_BUSY)
719 status = PEP_UNKNOWN_ERROR;
720 } while (result == SQLITE_BUSY);
721 sqlite3_reset(session->log);
726 DYNAMIC_API PEP_STATUS trustword(
727 PEP_SESSION session, uint16_t value, const char *lang,
728 char **word, size_t *wsize
731 PEP_STATUS status = PEP_STATUS_OK;
737 if (!(session && word && wsize))
738 return PEP_ILLEGAL_VALUE;
746 assert((lang[0] >= 'A' && lang[0] <= 'Z')
747 || (lang[0] >= 'a' && lang[0] <= 'z'));
748 assert((lang[1] >= 'A' && lang[1] <= 'Z')
749 || (lang[1] >= 'a' && lang[1] <= 'z'));
750 assert(lang[2] == 0);
752 sqlite3_reset(session->trustword);
753 sqlite3_bind_text(session->trustword, 1, lang, -1, SQLITE_STATIC);
754 sqlite3_bind_int(session->trustword, 2, value);
756 const int result = sqlite3_step(session->trustword);
757 if (result == SQLITE_ROW) {
758 *word = strdup((const char *) sqlite3_column_text(session->trustword,
761 *wsize = sqlite3_column_bytes(session->trustword, 1);
763 status = PEP_OUT_OF_MEMORY;
765 status = PEP_TRUSTWORD_NOT_FOUND;
767 sqlite3_reset(session->trustword);
771 DYNAMIC_API PEP_STATUS trustwords(
772 PEP_SESSION session, const char *fingerprint, const char *lang,
773 char **words, size_t *wsize, int max_words
776 const char *source = fingerprint;
785 assert(max_words >= 0);
787 if (!(session && fingerprint && words && wsize && max_words >= 0))
788 return PEP_ILLEGAL_VALUE;
793 buffer = calloc(1, MAX_TRUSTWORDS_SPACE);
796 return PEP_OUT_OF_MEMORY;
799 fsize = strlen(fingerprint);
801 if (!lang || !lang[0])
804 assert((lang[0] >= 'A' && lang[0] <= 'Z')
805 || (lang[0] >= 'a' && lang[0] <= 'z'));
806 assert((lang[1] >= 'A' && lang[1] <= 'Z')
807 || (lang[1] >= 'a' && lang[1] <= 'z'));
808 assert(lang[2] == 0);
811 while (source < fingerprint + fsize) {
818 for (value=0, j=0; j < 4 && source < fingerprint + fsize; ) {
819 if (*source >= 'a' && *source <= 'f')
820 value += (*source - 'a' + 10) << (3 - j++) * 4;
821 else if (*source >= 'A' && *source <= 'F')
822 value += (*source - 'A' + 10) << (3 - j++) * 4;
823 else if (*source >= '0' && *source <= '9')
824 value += (*source - '0') << (3 - j++) * 4;
829 _status = trustword(session, value, lang, &word, &_wsize);
830 if (_status == PEP_OUT_OF_MEMORY) {
832 return PEP_OUT_OF_MEMORY;
836 return PEP_TRUSTWORD_NOT_FOUND;
839 if (dest + _wsize < buffer + MAX_TRUSTWORDS_SPACE - 1) {
840 strncpy(dest, word, _wsize);
846 break; // buffer full
849 if (source < fingerprint + fsize
850 && dest + _wsize < buffer + MAX_TRUSTWORDS_SPACE - 1)
854 if (max_words && n_words >= max_words)
859 *wsize = dest - buffer;
860 return PEP_STATUS_OK;
863 pEp_identity *new_identity(
864 const char *address, const char *fpr, const char *user_id,
868 pEp_identity *result = calloc(1, sizeof(pEp_identity));
872 result->address = strdup(address);
873 assert(result->address);
874 if (result->address == NULL) {
880 result->fpr = strdup(fpr);
882 if (result->fpr == NULL) {
883 free_identity(result);
888 result->user_id = strdup(user_id);
889 assert(result->user_id);
890 if (result->user_id == NULL) {
891 free_identity(result);
896 result->username = strdup(username);
897 assert(result->username);
898 if (result->username == NULL) {
899 free_identity(result);
907 pEp_identity *identity_dup(const pEp_identity *src)
911 pEp_identity *dup = new_identity(src->address, src->fpr, src->user_id,
917 dup->comm_type = src->comm_type;
918 dup->lang[0] = src->lang[0];
919 dup->lang[1] = src->lang[1];
922 dup->flags = src->flags;
927 void free_identity(pEp_identity *identity)
930 free(identity->address);
932 free(identity->user_id);
933 free(identity->username);
938 DYNAMIC_API PEP_STATUS get_identity(
942 pEp_identity **identity
945 PEP_STATUS status = PEP_STATUS_OK;
946 static pEp_identity *_identity;
953 if (!(session && address && address[0] && identity))
954 return PEP_ILLEGAL_VALUE;
958 sqlite3_reset(session->get_identity);
959 sqlite3_bind_text(session->get_identity, 1, address, -1, SQLITE_STATIC);
960 sqlite3_bind_text(session->get_identity, 2, user_id, -1, SQLITE_STATIC);
962 const int result = sqlite3_step(session->get_identity);
965 _identity = new_identity(
967 (const char *) sqlite3_column_text(session->get_identity, 0),
969 (const char *) sqlite3_column_text(session->get_identity, 1)
972 if (_identity == NULL)
973 return PEP_OUT_OF_MEMORY;
975 _identity->comm_type = (PEP_comm_type)
976 sqlite3_column_int(session->get_identity, 2);
977 const char* const _lang = (const char *)
978 sqlite3_column_text(session->get_identity, 3);
979 if (_lang && _lang[0]) {
980 assert(_lang[0] >= 'a' && _lang[0] <= 'z');
981 assert(_lang[1] >= 'a' && _lang[1] <= 'z');
982 assert(_lang[2] == 0);
983 _identity->lang[0] = _lang[0];
984 _identity->lang[1] = _lang[1];
985 _identity->lang[2] = 0;
987 _identity->flags = (unsigned int)
988 sqlite3_column_int(session->get_identity, 4);
989 *identity = _identity;
992 status = PEP_CANNOT_FIND_IDENTITY;
996 sqlite3_reset(session->get_identity);
1000 DYNAMIC_API PEP_STATUS set_identity(
1001 PEP_SESSION session, const pEp_identity *identity
1008 assert(identity->address);
1009 assert(identity->fpr);
1010 assert(identity->user_id);
1011 assert(identity->username);
1013 if (!(session && identity && identity->address && identity->fpr &&
1014 identity->user_id && identity->username))
1015 return PEP_ILLEGAL_VALUE;
1018 PEP_STATUS status = blacklist_is_listed(session, identity->fpr, &listed);
1019 assert(status == PEP_STATUS_OK);
1020 if (status != PEP_STATUS_OK)
1024 return PEP_KEY_BLACKLISTED;
1026 sqlite3_exec(session->db, "BEGIN ;", NULL, NULL, NULL);
1028 if (identity->lang[0]) {
1029 assert(identity->lang[0] >= 'a' && identity->lang[0] <= 'z');
1030 assert(identity->lang[1] >= 'a' && identity->lang[1] <= 'z');
1031 assert(identity->lang[2] == 0);
1034 sqlite3_reset(session->set_person);
1035 sqlite3_bind_text(session->set_person, 1, identity->user_id, -1,
1037 sqlite3_bind_text(session->set_person, 2, identity->username, -1,
1039 if (identity->lang[0])
1040 sqlite3_bind_text(session->set_person, 3, identity->lang, 2,
1043 sqlite3_bind_null(session->set_person, 3);
1044 sqlite3_bind_text(session->set_person, 4, identity->fpr, -1,
1046 result = sqlite3_step(session->set_person);
1047 sqlite3_reset(session->set_person);
1048 if (result != SQLITE_DONE) {
1049 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1050 return PEP_CANNOT_SET_PERSON;
1053 sqlite3_reset(session->set_pgp_keypair);
1054 sqlite3_bind_text(session->set_pgp_keypair, 1, identity->fpr, -1,
1056 result = sqlite3_step(session->set_pgp_keypair);
1057 sqlite3_reset(session->set_pgp_keypair);
1058 if (result != SQLITE_DONE) {
1059 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1060 return PEP_CANNOT_SET_PGP_KEYPAIR;
1063 sqlite3_reset(session->set_identity);
1064 sqlite3_bind_text(session->set_identity, 1, identity->address, -1,
1066 sqlite3_bind_text(session->set_identity, 2, identity->fpr, -1,
1068 sqlite3_bind_text(session->set_identity, 3, identity->user_id, -1,
1070 sqlite3_bind_int(session->set_identity, 4, identity->flags);
1071 result = sqlite3_step(session->set_identity);
1072 sqlite3_reset(session->set_identity);
1073 if (result != SQLITE_DONE) {
1074 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1075 return PEP_CANNOT_SET_IDENTITY;
1078 sqlite3_reset(session->set_trust);
1079 sqlite3_bind_text(session->set_trust, 1, identity->user_id, -1,
1081 sqlite3_bind_text(session->set_trust, 2, identity->fpr, -1,
1083 sqlite3_bind_int(session->set_trust, 3, identity->comm_type);
1084 result = sqlite3_step(session->set_trust);
1085 sqlite3_reset(session->set_trust);
1086 if (result != SQLITE_DONE) {
1087 sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
1088 return PEP_CANNOT_SET_TRUST;
1091 result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
1092 if (result == SQLITE_OK)
1093 return PEP_STATUS_OK;
1095 return PEP_COMMIT_FAILED;
1098 DYNAMIC_API PEP_STATUS set_device_group(
1099 PEP_SESSION session,
1100 const char *group_name
1108 if (!(session && group_name))
1109 return PEP_ILLEGAL_VALUE;
1111 sqlite3_reset(session->set_device_group);
1112 sqlite3_bind_text(session->set_device_group, 1, group_name, -1,
1114 result = sqlite3_step(session->set_device_group);
1115 sqlite3_reset(session->set_device_group);
1116 if (result != SQLITE_DONE)
1117 return PEP_CANNOT_SET_PERSON;
1119 return PEP_STATUS_OK;
1122 DYNAMIC_API PEP_STATUS get_device_group(PEP_SESSION session, char **group_name)
1124 PEP_STATUS status = PEP_STATUS_OK;
1130 if (!(session && group_name))
1131 return PEP_ILLEGAL_VALUE;
1133 sqlite3_reset(session->get_device_group);
1135 result = sqlite3_step(session->get_device_group);
1138 *group_name = strdup(
1139 (const char *) sqlite3_column_text(session->get_device_group, 0));
1140 if(*group_name == NULL)
1141 status = PEP_OUT_OF_MEMORY;
1146 status = PEP_RECORD_NOT_FOUND;
1149 sqlite3_reset(session->get_device_group);
1153 DYNAMIC_API PEP_STATUS set_identity_flags(
1154 PEP_SESSION session,
1155 pEp_identity *identity,
1163 assert(identity->address);
1164 assert(identity->user_id);
1166 if (!(session && identity && identity->address && identity->user_id))
1167 return PEP_ILLEGAL_VALUE;
1169 sqlite3_reset(session->set_identity_flags);
1170 sqlite3_bind_int(session->set_identity_flags, 1, flags);
1171 sqlite3_bind_text(session->set_identity_flags, 2, identity->address, -1,
1173 sqlite3_bind_text(session->set_identity_flags, 3, identity->user_id, -1,
1175 result = sqlite3_step(session->set_identity_flags);
1176 sqlite3_reset(session->set_identity_flags);
1177 if (result != SQLITE_DONE)
1178 return PEP_CANNOT_SET_IDENTITY;
1180 identity->flags = flags;
1181 return PEP_STATUS_OK;
1184 DYNAMIC_API PEP_STATUS mark_as_compromized(
1185 PEP_SESSION session,
1192 assert(fpr && fpr[0]);
1194 if (!(session && fpr && fpr[0]))
1195 return PEP_ILLEGAL_VALUE;
1197 sqlite3_reset(session->mark_compromized);
1198 sqlite3_bind_text(session->mark_compromized, 1, fpr, -1,
1200 result = sqlite3_step(session->mark_compromized);
1201 sqlite3_reset(session->mark_compromized);
1203 if (result != SQLITE_DONE)
1204 return PEP_CANNOT_SET_TRUST;
1206 return PEP_STATUS_OK;
1209 void pEp_free(void *p)
1214 DYNAMIC_API PEP_STATUS get_trust(PEP_SESSION session, pEp_identity *identity)
1216 PEP_STATUS status = PEP_STATUS_OK;
1221 assert(identity->user_id);
1222 assert(identity->user_id[0]);
1223 assert(identity->fpr);
1224 assert(identity->fpr[0]);
1226 if (!(session && identity && identity->user_id && identity->user_id[0] &&
1227 identity->fpr && identity->fpr[0]))
1228 return PEP_ILLEGAL_VALUE;
1230 identity->comm_type = PEP_ct_unknown;
1232 sqlite3_reset(session->get_trust);
1233 sqlite3_bind_text(session->get_trust, 1, identity->user_id, -1,
1235 sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
1237 result = sqlite3_step(session->get_trust);
1240 int comm_type = (PEP_comm_type) sqlite3_column_int(session->get_trust,
1242 identity->comm_type = comm_type;
1247 status = PEP_CANNOT_FIND_IDENTITY;
1250 sqlite3_reset(session->get_trust);
1254 DYNAMIC_API PEP_STATUS least_trust(
1255 PEP_SESSION session,
1257 PEP_comm_type *comm_type
1260 PEP_STATUS status = PEP_STATUS_OK;
1267 if (!(session && fpr && comm_type))
1268 return PEP_ILLEGAL_VALUE;
1270 *comm_type = PEP_ct_unknown;
1272 sqlite3_reset(session->least_trust);
1273 sqlite3_bind_text(session->least_trust, 1, fpr, -1, SQLITE_STATIC);
1275 result = sqlite3_step(session->least_trust);
1278 int _comm_type = sqlite3_column_int(session->least_trust, 0);
1279 *comm_type = (PEP_comm_type) _comm_type;
1283 status = PEP_CANNOT_FIND_IDENTITY;
1286 sqlite3_reset(session->least_trust);
1290 DYNAMIC_API PEP_STATUS decrypt_and_verify(
1291 PEP_SESSION session, const char *ctext, size_t csize,
1292 char **ptext, size_t *psize, stringlist_t **keylist
1302 if (!(session && ctext && csize && ptext && psize && keylist))
1303 return PEP_ILLEGAL_VALUE;
1305 return session->cryptotech[PEP_crypt_OpenPGP].decrypt_and_verify(
1306 session, ctext, csize, ptext, psize, keylist);
1309 DYNAMIC_API PEP_STATUS encrypt_and_sign(
1310 PEP_SESSION session, const stringlist_t *keylist, const char *ptext,
1311 size_t psize, char **ctext, size_t *csize
1321 if (!(session && keylist && ptext && psize && ctext && csize))
1322 return PEP_ILLEGAL_VALUE;
1324 return session->cryptotech[PEP_crypt_OpenPGP].encrypt_and_sign(session,
1325 keylist, ptext, psize, ctext, csize);
1328 DYNAMIC_API PEP_STATUS verify_text(
1329 PEP_SESSION session, const char *text, size_t size,
1330 const char *signature, size_t sig_size, stringlist_t **keylist
1340 if (!(session && text && size && signature && sig_size && keylist))
1341 return PEP_ILLEGAL_VALUE;
1343 return session->cryptotech[PEP_crypt_OpenPGP].verify_text(session, text,
1344 size, signature, sig_size, keylist);
1347 DYNAMIC_API PEP_STATUS delete_keypair(PEP_SESSION session, const char *fpr)
1352 if (!(session && fpr))
1353 return PEP_ILLEGAL_VALUE;
1355 return session->cryptotech[PEP_crypt_OpenPGP].delete_keypair(session, fpr);
1358 DYNAMIC_API PEP_STATUS export_key(
1359 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
1367 if (!(session && fpr && key_data && size))
1368 return PEP_ILLEGAL_VALUE;
1370 return session->cryptotech[PEP_crypt_OpenPGP].export_key(session, fpr,
1371 key_data, size, false);
1374 DYNAMIC_API PEP_STATUS export_secrect_key(
1375 PEP_SESSION session, const char *fpr, char **key_data, size_t *size
1383 if (!(session && fpr && key_data && size))
1384 return PEP_ILLEGAL_VALUE;
1386 // don't accept key IDs but full fingerprints only
1387 if (strlen(fpr) < 16)
1388 return PEP_ILLEGAL_VALUE;
1390 return session->cryptotech[PEP_crypt_OpenPGP].export_key(session, fpr,
1391 key_data, size, true);
1394 DYNAMIC_API PEP_STATUS find_keys(
1395 PEP_SESSION session, const char *pattern, stringlist_t **keylist
1402 if (!(session && pattern && keylist))
1403 return PEP_ILLEGAL_VALUE;
1405 return session->cryptotech[PEP_crypt_OpenPGP].find_keys(session, pattern,
1410 DYNAMIC_API PEP_STATUS generate_keypair(
1411 PEP_SESSION session, pEp_identity *identity
1416 assert(identity->address);
1417 assert(identity->fpr == NULL || identity->fpr[0] == 0);
1418 assert(identity->username);
1420 if (!(session && identity && identity->address &&
1421 (identity->fpr == NULL || identity->fpr[0] == 0) &&
1422 identity->username))
1423 return PEP_ILLEGAL_VALUE;
1426 session->cryptotech[PEP_crypt_OpenPGP].generate_keypair(session,
1428 if (status != PEP_STATUS_OK)
1434 DYNAMIC_API PEP_STATUS get_key_rating(
1435 PEP_SESSION session,
1437 PEP_comm_type *comm_type
1444 if (!(session && fpr && comm_type))
1445 return PEP_ILLEGAL_VALUE;
1447 return session->cryptotech[PEP_crypt_OpenPGP].get_key_rating(session, fpr,
1451 DYNAMIC_API PEP_STATUS import_key(
1452 PEP_SESSION session,
1453 const char *key_data,
1455 identity_list **private_keys
1461 if (!(session && key_data))
1462 return PEP_ILLEGAL_VALUE;
1464 return session->cryptotech[PEP_crypt_OpenPGP].import_key(session, key_data,
1465 size, private_keys);
1468 DYNAMIC_API PEP_STATUS recv_key(PEP_SESSION session, const char *pattern)
1473 if (!(session && pattern))
1474 return PEP_ILLEGAL_VALUE;
1476 return session->cryptotech[PEP_crypt_OpenPGP].recv_key(session, pattern);
1479 DYNAMIC_API PEP_STATUS send_key(PEP_SESSION session, const char *pattern)
1484 if (!(session && pattern))
1485 return PEP_ILLEGAL_VALUE;
1487 return session->cryptotech[PEP_crypt_OpenPGP].send_key(session, pattern);
1490 DYNAMIC_API PEP_STATUS renew_key(
1491 PEP_SESSION session,
1499 if (!(session && fpr))
1500 return PEP_ILLEGAL_VALUE;
1502 return session->cryptotech[PEP_crypt_OpenPGP].renew_key(session, fpr, ts);
1505 DYNAMIC_API PEP_STATUS revoke_key(
1506 PEP_SESSION session,
1514 if (!(session && fpr))
1515 return PEP_ILLEGAL_VALUE;
1517 return session->cryptotech[PEP_crypt_OpenPGP].revoke_key(session, fpr,
1521 DYNAMIC_API PEP_STATUS key_expired(
1522 PEP_SESSION session,
1532 if (!(session && fpr && expired))
1533 return PEP_ILLEGAL_VALUE;
1535 return session->cryptotech[PEP_crypt_OpenPGP].key_expired(session, fpr,
1539 DYNAMIC_API PEP_STATUS key_revoked(
1540 PEP_SESSION session,
1549 if (!(session && fpr && revoked))
1550 return PEP_ILLEGAL_VALUE;
1552 return session->cryptotech[PEP_crypt_OpenPGP].key_revoked(session, fpr,
1556 static void _clean_log_value(char *text)
1559 for (char *c = text; *c; c++) {
1560 if (*c < 32 && *c != '\n')
1568 static char *_concat_string(char *str1, const char *str2, char delim)
1570 str2 = str2 ? str2 : "";
1571 size_t len1 = str1 ? strlen(str1) : 0;
1572 size_t len2 = strlen(str2);
1573 size_t len = len1 + len2 + 3;
1574 char * result = realloc(str1, len + 1);
1578 strcpy(result + len1 + 1, str2);
1579 result[len - 2] = '"';
1580 result[len - 1] = delim;
1590 DYNAMIC_API PEP_STATUS get_crashdump_log(
1591 PEP_SESSION session,
1596 PEP_STATUS status = PEP_STATUS_OK;
1597 char *_logdata= NULL;
1600 assert(maxlines >= 0 && maxlines <= CRASHDUMP_MAX_LINES);
1603 if (!(session && logdata && maxlines >= 0 && maxlines <=
1604 CRASHDUMP_MAX_LINES))
1605 return PEP_ILLEGAL_VALUE;
1609 int limit = maxlines ? maxlines : CRASHDUMP_DEFAULT_LINES;
1610 const char *timestamp = NULL;
1611 const char *title = NULL;
1612 const char *entity = NULL;
1613 const char *desc = NULL;
1614 const char *comment = NULL;
1616 sqlite3_reset(session->crashdump);
1617 sqlite3_bind_int(session->crashdump, 1, limit);
1622 result = sqlite3_step(session->crashdump);
1625 timestamp = (const char *) sqlite3_column_text(session->crashdump,
1627 title = (const char *) sqlite3_column_text(session->crashdump,
1629 entity = (const char *) sqlite3_column_text(session->crashdump,
1631 desc = (const char *) sqlite3_column_text(session->crashdump,
1633 comment = (const char *) sqlite3_column_text(session->crashdump,
1636 _logdata = _concat_string(_logdata, timestamp, ',');
1637 if (_logdata == NULL)
1640 _logdata = _concat_string(_logdata, title, ',');
1641 if (_logdata == NULL)
1644 _logdata = _concat_string(_logdata, entity, ',');
1645 if (_logdata == NULL)
1648 _logdata = _concat_string(_logdata, desc, ',');
1649 if (_logdata == NULL)
1652 _logdata = _concat_string(_logdata, comment, '\n');
1653 if (_logdata == NULL)
1656 _clean_log_value(_logdata);
1663 status = PEP_UNKNOWN_ERROR;
1664 result = SQLITE_DONE;
1666 } while (result != SQLITE_DONE);
1668 sqlite3_reset(session->crashdump);
1669 if (status == PEP_STATUS_OK)
1670 *logdata = _logdata;
1675 status = PEP_OUT_OF_MEMORY;
1681 DYNAMIC_API PEP_STATUS get_languagelist(
1682 PEP_SESSION session,
1686 PEP_STATUS status = PEP_STATUS_OK;
1687 char *_languages= NULL;
1692 if (!(session && languages))
1693 return PEP_ILLEGAL_VALUE;
1697 const char *lang = NULL;
1698 const char *name = NULL;
1699 const char *phrase = NULL;
1701 sqlite3_reset(session->languagelist);
1706 result = sqlite3_step(session->languagelist);
1709 lang = (const char *) sqlite3_column_text(session->languagelist,
1711 name = (const char *) sqlite3_column_text(session->languagelist,
1713 phrase = (const char *) sqlite3_column_text(session->languagelist,
1716 _languages = _concat_string(_languages, lang, ',');
1717 if (_languages == NULL)
1720 _languages = _concat_string(_languages, name, ',');
1721 if (_languages == NULL)
1724 _languages = _concat_string(_languages, phrase, '\n');
1725 if (_languages == NULL)
1734 status = PEP_UNKNOWN_ERROR;
1735 result = SQLITE_DONE;
1737 } while (result != SQLITE_DONE);
1739 sqlite3_reset(session->languagelist);
1740 if (status == PEP_STATUS_OK)
1741 *languages = _languages;
1746 status = PEP_OUT_OF_MEMORY;
1752 DYNAMIC_API PEP_STATUS get_phrase(
1753 PEP_SESSION session,
1759 PEP_STATUS status = PEP_STATUS_OK;
1761 assert(session && lang && lang[0] && lang[1] && lang[2] == 0 && phrase);
1762 if (!(session && lang && lang[0] && lang[1] && lang[2] == 0 && phrase))
1763 return PEP_ILLEGAL_VALUE;
1767 sqlite3_reset(session->i18n_token);
1768 sqlite3_bind_text(session->i18n_token, 1, lang, -1, SQLITE_STATIC);
1769 sqlite3_bind_int(session->i18n_token, 2, phrase_id);
1771 const char *_phrase = NULL;
1774 result = sqlite3_step(session->i18n_token);
1777 _phrase = (const char *) sqlite3_column_text(session->i18n_token, 0);
1781 status = PEP_PHRASE_NOT_FOUND;
1785 status = PEP_UNKNOWN_ERROR;
1788 if (status == PEP_STATUS_OK) {
1789 *phrase = strdup(_phrase);
1790 if (*phrase == NULL)
1794 sqlite3_reset(session->i18n_token);
1798 status = PEP_OUT_OF_MEMORY;
1804 static PEP_STATUS _get_sequence_value(PEP_SESSION session, const char *name,
1807 assert(session && name && value);
1808 if (!(session && name && value))
1809 return PEP_ILLEGAL_VALUE;
1811 PEP_STATUS status = PEP_STATUS_OK;
1813 sqlite3_reset(session->sequence_value2);
1814 sqlite3_bind_text(session->sequence_value2, 1, name, -1,
1816 int result = sqlite3_step(session->sequence_value2);
1819 int32_t _value = (int32_t)
1820 sqlite3_column_int(session->sequence_value2, 0);
1822 sqlite3_column_int(session->sequence_value2, 1);
1825 status = PEP_OWN_SEQUENCE;
1829 status = PEP_RECORD_NOT_FOUND;
1832 status = PEP_UNKNOWN_ERROR;
1834 sqlite3_reset(session->sequence_value2);
1839 static PEP_STATUS _increment_sequence_value(PEP_SESSION session,
1840 const char *name, int own)
1842 assert(session && name);
1843 if (!(session && name))
1844 return PEP_ILLEGAL_VALUE;
1846 sqlite3_reset(session->sequence_value1);
1847 sqlite3_bind_text(session->sequence_value1, 1, name, -1, SQLITE_STATIC);
1848 sqlite3_bind_int(session->sequence_value1, 2, own);
1849 int result = sqlite3_step(session->sequence_value1);
1850 assert(result == SQLITE_DONE);
1851 sqlite3_reset(session->sequence_value1);
1852 if (result == SQLITE_DONE)
1853 return PEP_STATUS_OK;
1855 return PEP_CANNOT_INCREASE_SEQUENCE;
1858 static PEP_STATUS _set_sequence_value(PEP_SESSION session,
1859 const char *name, int32_t value, int own)
1861 assert(session && name && value > 0);
1862 if (!(session && name && value > 0))
1863 return PEP_ILLEGAL_VALUE;
1865 sqlite3_reset(session->sequence_value3);
1866 sqlite3_bind_text(session->sequence_value3, 1, name, -1, SQLITE_STATIC);
1867 sqlite3_bind_int(session->sequence_value3, 2, value);
1868 sqlite3_bind_int(session->sequence_value3, 3, own);
1869 int result = sqlite3_step(session->sequence_value3);
1870 assert(result == SQLITE_DONE);
1871 sqlite3_reset(session->sequence_value3);
1872 if (result == SQLITE_DONE)
1873 return PEP_STATUS_OK;
1875 return PEP_CANNOT_SET_SEQUENCE_VALUE;
1878 DYNAMIC_API PEP_STATUS sequence_value(
1879 PEP_SESSION session,
1884 PEP_STATUS status = PEP_STATUS_OK;
1887 assert(name && value && *value >= 0);
1889 if (!(session && name && value && *value >= 0))
1890 return PEP_ILLEGAL_VALUE;
1894 unsigned char uuid[16];
1895 uuid_generate_random(uuid);
1896 uuid_unparse_upper(uuid, name);
1900 if (name == sync_uuid || strcmp(name, sync_uuid) == 0)
1905 int32_t old_value = 0;
1906 status = _get_sequence_value(session, name, &old_value);
1907 if (status != PEP_STATUS_OK && status != PEP_RECORD_NOT_FOUND)
1910 if (old_value >= *value) {
1911 return PEP_SEQUENCE_VIOLATED;
1914 status = _set_sequence_value(session, name, *value, own);
1919 assert(*value == 0);
1920 status = _increment_sequence_value(session, name, own);
1921 if (status == PEP_STATUS_OK) {
1922 status = _get_sequence_value(session, name, value);
1923 assert(*value < INT32_MAX);
1924 if (*value == INT32_MAX)
1925 return PEP_CANNOT_INCREASE_SEQUENCE;
1930 DYNAMIC_API PEP_STATUS set_revoked(
1931 PEP_SESSION session,
1932 const char *revoked_fpr,
1933 const char *replacement_fpr,
1934 const uint64_t revocation_date
1937 PEP_STATUS status = PEP_STATUS_OK;
1940 revoked_fpr && revoked_fpr[0] &&
1941 replacement_fpr && replacement_fpr[0]
1945 revoked_fpr && revoked_fpr[0] &&
1946 replacement_fpr && replacement_fpr[0]
1948 return PEP_ILLEGAL_VALUE;
1950 sqlite3_reset(session->set_revoked);
1951 sqlite3_bind_text(session->set_revoked, 1, revoked_fpr, -1, SQLITE_STATIC);
1952 sqlite3_bind_text(session->set_revoked, 2, replacement_fpr, -1,
1954 sqlite3_bind_int64(session->set_revoked, 3, revocation_date);
1958 result = sqlite3_step(session->set_revoked);
1961 status = PEP_STATUS_OK;
1965 status = PEP_UNKNOWN_ERROR;
1968 sqlite3_reset(session->set_revoked);
1972 DYNAMIC_API PEP_STATUS get_revoked(
1973 PEP_SESSION session,
1976 uint64_t *revocation_date
1979 PEP_STATUS status = PEP_STATUS_OK;
1990 return PEP_ILLEGAL_VALUE;
1992 *revoked_fpr = NULL;
1993 *revocation_date = 0;
1995 sqlite3_reset(session->get_revoked);
1996 sqlite3_bind_text(session->get_revoked, 1, fpr, -1, SQLITE_STATIC);
2000 result = sqlite3_step(session->get_revoked);
2003 *revoked_fpr = strdup((const char *)
2004 sqlite3_column_text(session->get_revoked, 0));
2006 *revocation_date = sqlite3_column_int64(session->get_revoked,
2009 status = PEP_OUT_OF_MEMORY;
2014 status = PEP_CANNOT_FIND_IDENTITY;
2017 sqlite3_reset(session->get_revoked);
2022 PEP_STATUS key_created(
2023 PEP_SESSION session,
2028 assert(session && fpr && created);
2029 if (!(session && fpr && created))
2030 return PEP_ILLEGAL_VALUE;
2032 return session->cryptotech[PEP_crypt_OpenPGP].key_created(session, fpr,
2036 DYNAMIC_API const char* get_engine_version() {
2037 return PEP_ENGINE_VERSION;
2041 DYNAMIC_API PEP_STATUS reset_peptest_hack(PEP_SESSION session)
2046 return PEP_ILLEGAL_VALUE;
2048 int int_result = sqlite3_exec(
2050 "delete from identity where address like '%@peptest.ch' ;",
2055 assert(int_result == SQLITE_OK);
2057 return PEP_STATUS_OK;