#INSTALL(DIRECTORY lib/fido/asm/ DESTINATION lib/fido/asm/)
ADD_SUBDIRECTORY(test/Dummy_ASM_DBUS)
ADD_SUBDIRECTORY(test/shell_tc)
+
#define _JSON_KEY_FACET_ID "facetID"
#define _JSON_KEY_HEADER "header"
#define _JSON_KEY_FC_PARAMS "fcParams"
-#define _JSON_KEY_FINAL_CHALLENGE "finalChallenge"
+#define _JSON_KEY_FINAL_CHALLENGE "finalChallenge"
#define _JSON_KEY_ASSERTIONS "assertions"
#define _JSON_KEY_POLICY "policy"
#define _JSON_KEY_ACCEPTED "accepted"
#define _JSON_KEY_VERSION "version"
#define _JSON_KEY_IDS "ids"
#define _JSON_KEY_APP_REGS "appRegs"
-#define _JSON_KEY_REQ_TYPE "requestType"
-#define _JSON_KEY_KEY_ID "keyID"
-#define _JSON_KEY_TRANSACTION "transaction"
+#define _JSON_KEY_REQ_TYPE "requestType"
+#define _JSON_KEY_KEY_ID "keyID"
+#define _JSON_KEY_TRANSACTION "transaction"
#define _JSON_KEY_CONTENT_TYPE "contentType"
#define _JSON_KEY_CONTENT "content"
-#define _JSON_KEY_REGISTER "Register"
+#define _JSON_KEY_REGISTER "Register"
#define _JSON_KEY_AUTHENTICATE "Authenticate"
-#define _JSON_KEY_DEREGISTER "Deregister"
+#define _JSON_KEY_DEREGISTER "Deregister"
#define _JSON_KEY_ASM_VERSION "asmVersion"
#define _JSON_KEY_GET_REGS "GetRegistrations"
#define _JSON_KEY_KTY "kty"
#define _JSON_KEY_CRV "crv"
#define _JSON_KEY_X "x"
#define _JSON_KEY_Y "y"
-#define _JSON_KEY_ARGS "args"
+#define _JSON_KEY_ARGS "args"
#define _JSON_KEY_VENDOR "vendor"
#define _JSON_KEY_BIN_PATH "bin_path"
#define _JSON_KEY_DBUS_METHOD_NAME "dbus_method_name"
/*JSON keys end*/
+#ifdef WITH_JSON_BUILDER
static void
__add_string_to_json_object(JsonBuilder *json_obj, const char *key, const char *val)
{
json_builder_set_member_name(json_obj, key);
json_builder_add_int_value(json_obj, val);
}
+#endif
+
+#ifndef WITH_JSON_BUILDER
+static gboolean
+__uaf_composer_compose_asm_init(JsonGenerator **generator, JsonObject **root_obj)
+{
+ _INFO("__uaf_composer_compose_asm_init");
+ JsonNode *root_node = NULL;
+
+ *generator = json_generator_new();
+ if(*generator == NULL) {
+ _INFO("json_generator_new is NULL");
+ goto CATCH;
+ }
+
+ root_node = json_node_new(JSON_NODE_OBJECT);
+ if (root_node == NULL) {
+ _INFO("*json_node_new is NULL");
+ goto CATCH;
+ }
+
+ *root_obj = json_object_new();
+ if(*root_obj == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ json_node_take_object(root_node, *root_obj);
+ json_generator_set_root(*generator, root_node);
+
+ return TRUE;
+
+
+ CATCH:
+ if (generator != NULL && *generator != NULL) {
+ g_object_unref(*generator);
+ *generator = NULL;
+ }
+
+ if (root_node != NULL) {
+ json_node_free(root_node);
+ root_node = NULL;
+ }
+
+ if (root_obj != NULL && *root_obj != NULL) {
+ g_object_unref(*root_obj);
+ *root_obj = NULL;
+ }
+ return FALSE;
+}
+
+static gboolean
+__uaf_composer_compose_asm_response_init(JsonGenerator **generator, JsonObject **root_obj)
+{
+ _INFO("__uaf_composer_compose_asm_init");
+ JsonNode *root_node = NULL;
+ JsonNode *gen_node = NULL;
+ JsonObject *gen_object = NULL;
+ JsonArray *rootArray = json_array_new();
+
+ *generator = json_generator_new();
+ if(*generator == NULL) {
+ _INFO("json_generator_new is NULL");
+ goto CATCH;
+ }
+
+ gen_node = json_node_new(JSON_NODE_ARRAY);
+ if (gen_node == NULL) {
+ _INFO("*json_node_new is NULL");
+ goto CATCH;
+ }
+
+ root_node = json_node_new(JSON_NODE_OBJECT);
+ if (root_node == NULL) {
+ _INFO("*json_node_new is NULL");
+ goto CATCH;
+ }
+
+ gen_object = json_object_new();
+ if(gen_object == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ *root_obj = json_object_new();
+ if(*root_obj == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ json_node_take_object(root_node, *root_obj);
+ json_array_add_element(rootArray, root_node);
+ json_node_take_array(gen_node, rootArray);
+ json_generator_set_root(*generator, gen_node);
+
+ return TRUE;
+
+
+ CATCH:
+ if (generator != NULL && *generator != NULL) {
+ g_object_unref(*generator);
+ *generator = NULL;
+ }
+
+ if (gen_node != NULL) {
+ json_node_free(gen_node);
+ root_node = NULL;
+ }
+
+ if (root_node != NULL) {
+ json_node_free(root_node);
+ root_node = NULL;
+ }
+
+ if (root_obj != NULL && *root_obj != NULL) {
+ g_object_unref(*root_obj);
+ *root_obj = NULL;
+ }
+ return FALSE;
+}
+
+static gboolean
+__uaf_composer_compose_asm_version(_version_t *version, JsonNode **node)
+{
+ _INFO("__uaf_composer_compose_asm_version");
+ if (!version && version->major && version->minor) {
+ _INFO("invalid uaf version");
+ return FALSE;
+ }
+
+ *node = json_node_new(JSON_NODE_OBJECT);
+ if (*node == NULL) {
+ _INFO("json_node_new is NULL");
+ goto CATCH;
+ }
+
+ JsonObject *obj = json_object_new();
+ if(obj == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ json_object_set_int_member(obj, _JSON_KEY_MAJOR, version->major);
+ json_object_set_int_member(obj, _JSON_KEY_MINOR, version->minor);
+
+ json_node_take_object(*node, obj);
+
+ return TRUE;
+
+ CATCH:
+ if (node !=NULL && *node != NULL) {
+ json_node_free(*node);
+ *node = NULL;
+ }
+
+ if (obj != NULL && obj != NULL) {
+ g_object_unref(obj);
+ obj = NULL;
+ }
+ return FALSE;
+}
+
+static gboolean
+__uaf_composer_compose_asm_reg_in(_fido_asm_reg_in_t *reg_in, JsonNode **node)
+{
+ _INFO("__uaf_composer_compose_asm_versiom");
+ if (!reg_in) {
+ _INFO("invalid uaf version");
+ return FALSE;
+ }
+
+ *node = json_node_new(JSON_NODE_OBJECT);
+ if (*node == NULL) {
+ _INFO("json_node_new is NULL");
+ goto CATCH;
+ }
+
+ JsonObject *obj = json_object_new();
+ if(obj == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ if (reg_in->app_id)
+ json_object_set_string_member(obj, _JSON_KEY_APPID, reg_in->app_id);
+
+ if (reg_in->user_name)
+ json_object_set_string_member(obj, _JSON_KEY_USER_NAME, reg_in->user_name);
+
+ if (reg_in->final_challenge)
+ json_object_set_string_member(obj, _JSON_KEY_FINAL_CHALLENGE, reg_in->final_challenge);
+
+ if (reg_in->attestation_type)
+ json_object_set_int_member(obj, _JSON_KEY_ATT_TYPE, reg_in->attestation_type);
+
+ json_node_take_object(*node, obj);
+
+ return TRUE;
+
+ CATCH:
+ if (node != NULL && *node != NULL) {
+ json_node_free(*node);
+ *node = NULL;
+ }
+
+ if (obj != NULL && obj != NULL) {
+ g_object_unref(obj);
+ obj = NULL;
+ }
+ return FALSE;
+}
+
+static gboolean
+__uaf_composer_compose_asm_auth_in(_fido_asm_auth_in_t *auth_in, JsonNode **node)
+{
+ _INFO("__uaf_composer_compose_asm_auth_in");
+ if (!auth_in) {
+ _INFO("invalid uaf version");
+ return FALSE;
+ }
+
+ GList* iter;
+ *node = json_node_new(JSON_NODE_OBJECT);
+ if (*node == NULL) {
+ _INFO("json_node_new is NULL");
+ goto CATCH;
+ }
+
+ JsonObject *obj = json_object_new();
+ if(obj == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ if (auth_in->app_id)
+ json_object_set_string_member(obj, _JSON_KEY_APPID, auth_in->app_id);
+
+ if (auth_in->key_ids) {
+ JsonArray *ids = json_array_new();
+
+ for (iter = auth_in->key_ids; iter != NULL; iter = g_list_next(iter)) {
+ json_array_add_string_element(ids, (char *)iter->data);
+ }
+
+ json_object_set_array_member(obj, _JSON_KEY_KEY_IDS, ids);
+ }
+
+ if (auth_in->final_challenge)
+ json_object_set_string_member(obj, _JSON_KEY_FINAL_CHALLENGE, auth_in->final_challenge);
+
+ if(auth_in->trans_list != NULL) {
+ JsonArray *transArray = json_array_new();
+ GList *iter = g_list_first(auth_in->trans_list);
+ while(iter != NULL) {
+ _fido_asm_transaction_t *val = (_fido_asm_transaction_t*)(iter->data);
+ JsonNode *transNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *transObject = json_object_new();
+
+ json_object_set_string_member(transObject, _JSON_KEY_CONTENT_TYPE, val->content_type);
+ json_object_set_string_member(transObject, _JSON_KEY_CONTENT, val->content);
+
+ JsonNode *tcNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *tcObject = json_object_new();
+
+ if(val->display_charac != NULL) {
+ json_object_set_int_member(tcObject, _JSON_KEY_WIDTH, val->display_charac->width);
+ json_object_set_int_member(tcObject, _JSON_KEY_HEIGHT, val->display_charac->height);
+ json_object_set_int_member(tcObject, _JSON_KEY_BIT_DEPTH, val->display_charac->bit_depth);
+ json_object_set_int_member(tcObject, _JSON_KEY_COLOR_TYPE, val->display_charac->color_type);
+ json_object_set_int_member(tcObject, _JSON_KEY_COMPRESSION, val->display_charac->compression);
+ json_object_set_int_member(tcObject, _JSON_KEY_FILTER, val->display_charac->filter);
+ json_object_set_int_member(tcObject, _JSON_KEY_INTERLACE, val->display_charac->interlace);
+
+ if(val->display_charac != NULL) {
+ JsonArray *plteArray = json_array_new();
+
+ GList *plte_iter = g_list_first(val->display_charac->plte);
+ while(plte_iter != NULL) {
+ _fido_asm_rgb_pallette_entry_t *plte = (_fido_asm_rgb_pallette_entry_t*)(plte_iter->data);
+ JsonNode *plteNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *plteObject = json_object_new();
+
+ json_object_set_int_member(plteObject, _JSON_KEY_R, plte->r);
+ json_object_set_int_member(plteObject, _JSON_KEY_B, plte->b);
+ json_object_set_int_member(plteObject, _JSON_KEY_G, plte->g);
+
+ json_node_take_object(plteNode, plteObject);
+ json_array_add_element(plteArray, plteNode);
+
+ plte_iter = plte_iter->next;
+ }
+ json_object_set_array_member(tcObject, _JSON_KEY_PLTE, plteArray);
+ }
+ json_node_take_object(tcNode, tcObject);
+ json_object_set_member(transObject, "tcDisplayPNGCharacterstics", tcNode);
+ }
+ json_node_take_object(transNode, transObject);
+ json_array_add_element(transArray, transNode);
+ iter = iter->next;
+ }
+ json_object_set_array_member(obj, _JSON_KEY_TRANSACTION, transArray);
+ }
+
+ json_node_take_object(*node, obj);
+
+ return TRUE;
+
+ CATCH:
+ if (*node != NULL) {
+ json_node_free(*node);
+ *node = NULL;
+ }
+
+ if (obj != NULL && obj != NULL) {
+ g_object_unref(obj);
+ obj = NULL;
+ }
+ return FALSE;
+}
+#endif
static char*
__get_string_from_json_object(JsonObject *obj, const char *key)
return _INVALID_INT;
int int_val = json_object_get_int_member(obj, key);
- dlog_print(DLOG_INFO, "FIDO", "[%s] = [%d]", key, int_val);
+ _INFO("[%s] = [%d]", key, int_val);
return int_val;
}
JsonArray *auth_algo_arr = json_object_get_array_member(match_obj, _JSON_KEY_AUTH_ALGOS);
if (auth_algo_arr) {
match_criteria->auth_algo_list = __get_int_list_from_json_array(auth_algo_arr);
- }
+ }
JsonArray *assertion_schm_arr = json_object_get_array_member(match_obj, _JSON_KEY_ASSERT_SCHEMES);
if (assertion_schm_arr) {
match_criteria->assertion_scheme_list = __get_string_list_from_json_array(assertion_schm_arr);
- }
+ }
JsonArray *att_type_arr = json_object_get_array_member(match_obj, _JSON_KEY_ATT_TYPES);
if (att_type_arr) {
_INFO("_uaf_parser_parse_match is returning match_criteria");
return match_criteria;
- }
+ }
_INFO("_uaf_parser_parse_match is returning NULL");
return NULL;
_asm_out_t*
_uaf_parser_parse_asm_response_reg(const char *asm_response_json, int *error_code)
{
+ _INFO("_uaf_parser_parse_asm_response_reg[%s]", asm_response_json);
+
_asm_out_t *asm_out = NULL;
int status = 0;
GError *parser_err = NULL;
{
_INFO("_uaf_composer_compose_asm_reg_request start");
+#ifdef WITH_JSON_BUILDER
+
/*Builder start*/
JsonBuilder *builder = json_builder_new();
json_builder_begin_object(builder);
__add_string_to_json_object(builder, _JSON_KEY_USER_NAME, reg_in->user_name);
__add_string_to_json_object(builder, _JSON_KEY_FINAL_CHALLENGE, reg_in->final_challenge);
- if (reg_in->attestation_type != _INVALID_INT) {
+ if (reg_in->attestation_type) {
json_builder_set_member_name(builder, _JSON_KEY_ATT_TYPE);
json_builder_add_int_value(builder, reg_in->attestation_type);
if (gen != NULL)
g_object_unref(gen);
- _INFO("%s", json);
-
+ _INFO("asm_reg_req : %s", json);
_INFO("_uaf_composer_compose_asm_reg_request end");
return 0;
_INFO("_uaf_composer_compose_asm_reg_request fail");
return -1;
+
+#else
+
+ _INFO("Composer _uaf_composer_compose_asm_reg_request");
+
+ JsonNode *version_node = NULL;
+ JsonNode *register_node = NULL;
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if (__uaf_composer_compose_asm_init(&generator, &root_obj) != TRUE) {
+ _INFO("__uaf_composer_compose_asm_init fail");
+ goto CATCH;
+ }
+
+ json_object_set_string_member(root_obj, _JSON_KEY_REQ_TYPE, _JSON_KEY_REGISTER);
+
+ if (__uaf_composer_compose_asm_version(version, &version_node) != TRUE) {
+ _INFO("__uaf_composer_compose_asm_version fail");
+ goto CATCH;
+ }
+ else
+ json_object_set_member(root_obj, _JSON_KEY_ASM_VERSION, version_node);
+
+ json_object_set_int_member(root_obj, _JSON_KEY_AUTH_INDEX, auth_index);
+
+ if (!__uaf_composer_compose_asm_reg_in(reg_in, ®ister_node)) {
+ _INFO("__uaf_composer_compose_asm_reg_in fail");
+ goto CATCH;
+ }
+ else
+ json_object_set_member(root_obj, _JSON_KEY_ARGS, register_node);
+
+ *asm_reg_json = json_generator_to_data(generator, NULL);
+
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ return 0;
+
+ CATCH:
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if (version_node != NULL) {
+ json_node_free(version_node);
+ version_node = NULL;
+ }
+
+ if (register_node != NULL) {
+ json_node_free(register_node);
+ register_node = NULL;
+ }
+
+ if (root_obj != NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+ return -1;
+#endif
}
int
{
_INFO("_uaf_composer_compose_asm_auth_request start");
+#ifdef WITH_JSON_BUILDER
+
/*Builder start*/
JsonBuilder *builder = json_builder_new();
json_builder_begin_object(builder);
/*contentType*/
__add_string_to_json_object(builder, _JSON_KEY_CONTENT_TYPE, val->content_type);
+
/*content*/
__add_string_to_json_object(builder, _JSON_KEY_CONTENT, val->content);
+
/*tcDisplayPNGCharacteristics*/
if (val->display_charac != NULL) {
+ json_builder_set_member_name(builder, "tcDisplayPNGCharacteristics");
+ json_builder_begin_object(builder);
+
__add_int_to_json_object(builder, _JSON_KEY_WIDTH, val->display_charac->width);
__add_int_to_json_object(builder, _JSON_KEY_HEIGHT, val->display_charac->height);
__add_int_to_json_object(builder, _JSON_KEY_BIT_DEPTH, val->display_charac->bit_depth);
/*plte*/
if (val->display_charac->plte != NULL) {
-
+ json_builder_set_member_name(builder, _JSON_KEY_PLTE);
json_builder_begin_array(builder);
GList *plte_iter = g_list_first(val->display_charac->plte);
while (plte_iter != NULL) {
_fido_asm_rgb_pallette_entry_t *plte = (_fido_asm_rgb_pallette_entry_t*)(plte_iter->data);
+ json_builder_begin_object(builder);
+
__add_int_to_json_object(builder, _JSON_KEY_R, plte->r);
__add_int_to_json_object(builder, _JSON_KEY_G, plte->g);
__add_int_to_json_object(builder, _JSON_KEY_B, plte->b);
+ json_builder_end_object(builder);
+
plte_iter = plte_iter->next;
}
json_builder_end_array(builder);
}
+ json_builder_end_object(builder);
}
json_builder_end_object(builder);
g_object_unref(gen);
_INFO("%s", json);
-
_INFO("_uaf_composer_compose_asm_auth_request end");
return 0;
_INFO("_uaf_composer_compose_asm_auth_request fail");
return -1;
+
+#else
+ JsonNode *version_node = NULL;
+ JsonNode *auth_node = NULL;
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if (__uaf_composer_compose_asm_init(&generator, &root_obj) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_auth_request fail");
+ goto CATCH;
+ }
+
+ /*requestType*/
+ json_object_set_string_member(root_obj, _JSON_KEY_REQ_TYPE, _JSON_KEY_AUTHENTICATE);
+
+ /*authIndex*/
+ json_object_set_int_member(root_obj, _JSON_KEY_AUTH_INDEX, auth_index);
+
+ /*version*/
+ if (__uaf_composer_compose_asm_version(version, &version_node) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_auth_request fail");
+ goto CATCH;
+ }
+ else
+ json_object_set_member(root_obj, _JSON_KEY_ASM_VERSION, version_node);
+
+ /*args*/
+ if (__uaf_composer_compose_asm_auth_in(auth_in, &auth_node) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_auth_request fail");
+ goto CATCH;
+ }
+ else
+ json_object_set_member(root_obj, _JSON_KEY_ARGS, auth_node);
+
+ /*Transaction list composing*/
+
+ *asm_auth_json = json_generator_to_data(generator, NULL);
+
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ return 0;
+
+CATCH:
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if (version_node != NULL) {
+ json_node_free(version_node);
+ version_node = NULL;
+ }
+
+ if (auth_node != NULL) {
+ json_node_free(auth_node);
+ auth_node = NULL;
+ }
+
+ if (root_obj != NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+ return -1;
+#endif
}
int
{
_INFO("_uaf_composer_compose_asm_dereg_request start");
+#ifdef WITH_JSON_BUILDER
+
/*Builder start*/
JsonBuilder *builder = json_builder_new();
JsonBuilder *root = json_builder_begin_object(builder);
g_object_unref(gen);
_INFO("%s", json);
-
_INFO("_uaf_composer_compose_asm_dereg_request end");
return 0;
_INFO("_uaf_composer_compose_asm_dereg_request fail");
return -1;
+#else
+
+ JsonNode *version_node = NULL;
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if (__uaf_composer_compose_asm_init(&generator, &root_obj) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_dereg_request fail");
+ goto CATCH;
+ }
+
+ /*requestType*/
+ json_object_set_string_member(root_obj, _JSON_KEY_REQ_TYPE, _JSON_KEY_DEREGISTER);
+
+ /*authIndex*/
+ json_object_set_int_member(root_obj, _JSON_KEY_AUTH_INDEX, auth_index);
+
+ /*version*/
+ if (__uaf_composer_compose_asm_version(version, &version_node) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_dereg_request fail");
+ goto CATCH;
+ }
+ else
+ json_object_set_member(root_obj, _JSON_KEY_ASM_VERSION, version_node);
+
+ /*args*/
+ JsonNode *argNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *argObject = json_object_new();
+
+ json_object_set_string_member(argObject, _JSON_KEY_APPID, dereg_in->app_id);
+ json_object_set_string_member(argObject, _JSON_KEY_KEY_ID, dereg_in->key_id);
+
+ json_node_take_object(argNode, argObject);
+
+ json_object_set_member(root_obj, _JSON_KEY_ARGS, argNode);
+
+ gsize len = 0;
+ char *json = json_generator_to_data(generator, &len);
+ if (json != NULL) {
+ *asm_dereg_json = json;
+ _INFO("_uaf_composer_compose_uaf_process_response_reg return success");
+
+ _INFO("%s", json);
+
+ _INFO("_uaf_composer_compose_asm_dereg_request end");
+ }
+
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ return 0;
+
+CATCH:
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if (version_node != NULL) {
+ json_node_free(version_node);
+ version_node = NULL;
+ }
+
+ if (root_obj != NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+ return -1;
+#endif
}
//{"appID":"https://qa-egypt.noknoktest.com:443/UAFSampleProxy/uaf/facets.uaf","challenge":"uYBuGQf7r-LND16Q0GUpPRi112UjCtcym3awjm-MmmI","channelBinding":{},"facetID":"com.noknok.android.sampleapp"}
{
_INFO("_uaf_composer_compose_final_challenge");
+#ifdef WITH_JSON_BUILDER
+
JsonBuilder *builder = json_builder_new();
json_builder_begin_object(builder);
return ((char*)fc_enc);
+#else
+
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if(__uaf_composer_compose_asm_init(&generator, &root_obj) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_init fail");
+ goto CATCH;
+ }
+
+ json_object_set_string_member(root_obj, _JSON_KEY_APPID, app_id);
+ json_object_set_string_member(root_obj, _JSON_KEY_CHALLENGE, challenge);
+
+ JsonNode *jsonNode = NULL;
+ JsonObject *jsonObject = json_object_new();
+
+ if(ch_bin != NULL) {
+ JsonParser *chb_parser = json_parser_new();
+
+ GError *chb_err = NULL;
+ bool chb_parsed = json_parser_load_from_data(chb_parser, ch_bin, -1, &chb_err);
+ if (chb_parsed == FALSE) {
+ return NULL;
+ }
+
+ JsonNode *chb_root = json_parser_get_root(chb_parser);
+ if(chb_root == NULL) {
+ return NULL;
+ }
+
+ JsonObject *chb_root_obj = json_node_get_object(chb_root);
+ if(chb_root_obj == NULL) {
+ return NULL;
+ }
+
+ char *end_pt = (char*)json_object_get_string_member(chb_root_obj, _JSON_KEY_SERVER_END_POINT);
+ char *cert =(char*)json_object_get_string_member(chb_root_obj, _JSON_KEY_TLS_SERVER_CERT);
+ char *uni = (char*)json_object_get_string_member(chb_root_obj, _JSON_KEY_TLS_UNIQUE);
+ char *cid = (char*)json_object_get_string_member(chb_root_obj, _JSON_KEY_CID_PUB_KEY);
+
+ json_object_set_string_member(jsonObject, _JSON_KEY_SERVER_END_POINT, end_pt);
+ json_object_set_string_member(jsonObject, _JSON_KEY_TLS_SERVER_CERT, cert);
+ json_object_set_string_member(jsonObject, _JSON_KEY_TLS_UNIQUE, uni);
+ json_object_set_string_member(jsonObject, _JSON_KEY_CID_PUB_KEY, cid);
+
+ SAFE_DELETE(end_pt);
+ SAFE_DELETE(cert);
+ SAFE_DELETE(uni);
+ SAFE_DELETE(cid);
+
+ g_object_unref(chb_parser);
+ }
+
+ /*If no channledbinding to add, putting empty*/
+ json_node_take_object(jsonNode, jsonObject);
+ json_object_set_member(root_obj, _JSON_KEY_CH_BINDING, jsonNode);
+
+ char *json_str = NULL;
+ gsize len = 0;
+ json_str = json_generator_to_data(generator, &len);
+
+ if (json_str == NULL)
+ return NULL;
+
+ int inlen = strlen(json_str);
+ int fc_enc_len = (4 * ((inlen + 2) / 3)) + 1;
+
+ unsigned char *fc_enc = calloc(1, fc_enc_len);
+
+ int r = _fido_b64url_encode((unsigned char*)json_str, inlen, fc_enc, &fc_enc_len);
+
+ _INFO("_fido_b64url_encode len=[%d]", fc_enc_len);
+
+ SAFE_DELETE(json_str);
+ g_object_unref(generator);
+
+ if (r != 0)
+ return NULL;
+
+ _INFO("_fido_b64url_encoded string=%s", fc_enc);
+
+ return ((char*)fc_enc);
+
+CATCH:
+ if(generator!=NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if(root_obj!=NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+ return NULL;
+#endif
}
int
{
_INFO("_uaf_composer_compose_uaf_process_response_reg");
+#ifdef WITH_JSON_BUILDER
+
RET_IF_FAIL(header != NULL, FIDO_ERROR_PROTOCOL_ERROR);
/*Only 1.0 protocol support*/
json_builder_begin_array(builder);
GList *assertions_iter = g_list_first(assertions);
while (assertions_iter != NULL) {
+
_auth_reg_assertion_t *ass_data = (_auth_reg_assertion_t*)(assertions_iter->data);
json_builder_begin_object(builder);
json_builder_set_member_name(builder, _JSON_KEY_ASSERTION);
json_builder_set_member_name(builder, _JSON_KEY_ASSERT_SCHEME);
json_builder_add_string_value(builder, ass_data->assertion_schm);
- /*tcDisplayPNGCharacteristics*/
- if (ass_data->tc_disp_char_list != NULL) {
- json_builder_set_member_name(builder, "tcDisplayPNGCharacteristics");
- json_builder_begin_array(builder);
+ /*tcDisplayPNGCharacteristics*/
+ if (ass_data->tc_disp_char_list != NULL) {
+ json_builder_set_member_name(builder, "tcDisplayPNGCharacteristics");
+ json_builder_begin_array(builder);
- GList *iter = g_list_first(ass_data->tc_disp_char_list);
- while (iter != NULL) {
+ GList *iter = g_list_first(ass_data->tc_disp_char_list);
+ while (iter != NULL) {
- fido_display_png_characteristics_descriptor_s *png_data =
- (fido_display_png_characteristics_descriptor_s*) (iter->data);
+ fido_display_png_characteristics_descriptor_s *png_data =
+ (fido_display_png_characteristics_descriptor_s*) (iter->data);
- if (png_data != NULL) {
+ if (png_data != NULL) {
- json_builder_begin_object(builder);
+ json_builder_begin_object(builder);
- __add_int_to_json_object(builder, _JSON_KEY_WIDTH, png_data->width);
- __add_int_to_json_object(builder, _JSON_KEY_HEIGHT, png_data->height);
- __add_int_to_json_object(builder, _JSON_KEY_BIT_DEPTH, png_data->bit_depth);
- __add_int_to_json_object(builder, _JSON_KEY_COLOR_TYPE, png_data->color_type);
- __add_int_to_json_object(builder, _JSON_KEY_COMPRESSION, png_data->compression);
- __add_int_to_json_object(builder, _JSON_KEY_FILTER, png_data->filter);
- __add_int_to_json_object(builder, _JSON_KEY_INTERLACE, png_data->interlace);
+ __add_int_to_json_object(builder, _JSON_KEY_WIDTH, png_data->width);
+ __add_int_to_json_object(builder, _JSON_KEY_HEIGHT, png_data->height);
+ __add_int_to_json_object(builder, _JSON_KEY_BIT_DEPTH, png_data->bit_depth);
+ __add_int_to_json_object(builder, _JSON_KEY_COLOR_TYPE, png_data->color_type);
+ __add_int_to_json_object(builder, _JSON_KEY_COMPRESSION, png_data->compression);
+ __add_int_to_json_object(builder, _JSON_KEY_FILTER, png_data->filter);
+ __add_int_to_json_object(builder, _JSON_KEY_INTERLACE, png_data->interlace);
- if (png_data->plte != NULL) {
- /*plte array start*/
+ if (png_data->plte != NULL) {
+ /*plte array start*/
- json_builder_set_member_name(builder, _JSON_KEY_PLTE);
- json_builder_begin_array(builder);
+ json_builder_set_member_name(builder, _JSON_KEY_PLTE);
+ json_builder_begin_array(builder);
- GList *plte_iter = g_list_first(png_data->plte);
- while (plte_iter != NULL) {
+ GList *plte_iter = g_list_first(png_data->plte);
+ while (plte_iter != NULL) {
- fido_rgb_pallette_entry_s *plte_data = (fido_rgb_pallette_entry_s*)(plte_iter->data);
- if (plte_data != NULL) {
- json_builder_begin_object(builder);
+ fido_rgb_pallette_entry_s *plte_data = (fido_rgb_pallette_entry_s*)(plte_iter->data);
+ if (plte_data != NULL) {
+ json_builder_begin_object(builder);
- __add_int_to_json_object(builder, _JSON_KEY_R, plte_data->r);
- __add_int_to_json_object(builder, _JSON_KEY_G, plte_data->g);
- __add_int_to_json_object(builder, _JSON_KEY_B, plte_data->b);
+ __add_int_to_json_object(builder, _JSON_KEY_R, plte_data->r);
+ __add_int_to_json_object(builder, _JSON_KEY_G, plte_data->g);
+ __add_int_to_json_object(builder, _JSON_KEY_B, plte_data->b);
- json_builder_end_object(builder);
- }
+ json_builder_end_object(builder);
+ }
- plte_iter = plte_iter->next;
- }
+ plte_iter = plte_iter->next;
+ }
- json_builder_end_array(builder);
+ json_builder_end_array(builder);
- /*plte array end*/
- }
+ /*plte array end*/
+ }
- json_builder_end_object(builder);
- }
+ json_builder_end_object(builder);
+ }
- iter = iter->next;
- }
+ iter = iter->next;
+ }
- json_builder_end_array(builder);
- }
+ json_builder_end_array(builder);
+ }
json_builder_end_object(builder);
_INFO("_uaf_composer_compose_uaf_process_response_reg return fail");
g_object_unref(gen);
return FIDO_ERROR_PROTOCOL_ERROR;
+
+#else
+
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if(__uaf_composer_compose_asm_response_init(&generator, &root_obj) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_init fail");
+ goto CATCH;
+ }
+
+ /*header*/
+ JsonNode *_header = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *obj1 = json_object_new();
+ if(obj1 == NULL) {
+ _INFO("json_object_new is NULL");
+ goto CATCH;
+ }
+
+ json_object_set_string_member(obj1, _JSON_KEY_APPID, header->app_id);
+ json_object_set_string_member(obj1, _JSON_KEY_OP, header->operation);
+ json_object_set_string_member(obj1, _JSON_KEY_SERVER_DATA, header->server_data);
+
+ JsonNode *upv = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *obj2 = json_object_new();
+ if(obj2 == NULL) {
+ _INFO("json_object_new is NULL");
+ goto CATCH;
+ }
+
+ json_object_set_int_member(obj2, _JSON_KEY_MAJOR, header->version->major);
+ json_object_set_int_member(obj2, _JSON_KEY_MINOR, header->version->minor);
+
+ json_node_take_object(upv, obj2);
+
+ json_object_set_member(obj1, _JSON_KEY_UPV, upv);
+
+ json_node_take_object(_header, obj1);
+ json_object_set_member(root_obj, _JSON_KEY_HEADER, _header);
+
+ /*fcparams*/
+
+ json_object_set_string_member(root_obj, _JSON_KEY_FC_PARAMS, final_ch);
+ _INFO("[LOG] final_ch = %s", final_ch);
+
+ /*assertions*/
+ JsonArray *assArray = json_array_new();
+ GList *assertions_iter = g_list_first(assertions);
+ while (assertions_iter != NULL) {
+
+ _auth_reg_assertion_t *ass_data = (_auth_reg_assertion_t*)(assertions_iter->data);
+ JsonNode *assNode = json_node_new(JSON_NODE_OBJECT);;
+ JsonObject *assObject = json_object_new();
+ json_object_set_string_member(assObject, _JSON_KEY_ASSERTION, ass_data->assertion);
+ json_object_set_string_member(assObject, _JSON_KEY_ASSERT_SCHEME, ass_data->assertion_schm);
+
+ /*tcDisplayPNGCharacteristics*/
+ if (ass_data->tc_disp_char_list != NULL) {
+ JsonArray *tcArray = json_array_new();
+ GList *iter = g_list_first(ass_data->tc_disp_char_list);
+ while (iter != NULL) {
+ fido_display_png_characteristics_descriptor_s *png_data =
+ (fido_display_png_characteristics_descriptor_s*) (iter->data);
+
+ if (png_data != NULL) {
+ JsonNode *tcNode = json_node_new(JSON_NODE_OBJECT);;
+ JsonObject *tcObject = json_object_new();
+
+ json_object_set_int_member(tcObject, _JSON_KEY_WIDTH, png_data->width);
+ json_object_set_int_member(tcObject, _JSON_KEY_HEIGHT, png_data->height);
+ json_object_set_int_member(tcObject, _JSON_KEY_BIT_DEPTH, png_data->bit_depth);
+ json_object_set_int_member(tcObject, _JSON_KEY_COLOR_TYPE, png_data->color_type);
+ json_object_set_int_member(tcObject, _JSON_KEY_COMPRESSION, png_data->compression);
+ json_object_set_int_member(tcObject, _JSON_KEY_FILTER, png_data->filter);
+ json_object_set_int_member(tcObject, _JSON_KEY_INTERLACE, png_data->interlace);
+
+ if (png_data->plte != NULL) {
+ /*plte array start*/
+ JsonArray *plteArray = json_array_new();
+ GList *plte_iter = g_list_first(png_data->plte);
+ while (plte_iter != NULL) {
+
+ fido_rgb_pallette_entry_s *plte_data = (fido_rgb_pallette_entry_s*)(plte_iter->data);
+ if (plte_data != NULL) {
+ JsonNode *plteNode = json_node_new(JSON_NODE_OBJECT);;
+ JsonObject *plteObject = json_object_new();
+ json_object_set_int_member(plteObject, _JSON_KEY_R, plte_data->r);
+ json_object_set_int_member(plteObject, _JSON_KEY_G, plte_data->g);
+ json_object_set_int_member(plteObject, _JSON_KEY_B, plte_data->b);
+
+ json_node_take_object(plteNode, plteObject);
+ json_array_add_element(plteArray, plteNode);
+ }
+ plte_iter = plte_iter->next;
+ }
+ json_object_set_array_member(tcObject, _JSON_KEY_PLTE, plteArray);
+ }
+ json_node_take_object(tcNode, tcObject);
+ json_array_add_element(tcArray, tcNode);
+ }
+ iter = iter->next;
+ }
+ json_object_set_array_member(assObject, "tcDisplayPNGCharacteristics", tcArray);
+ }
+ json_node_take_object(assNode, assObject);
+ json_array_add_element(assArray, assNode);
+ assertions_iter = assertions_iter->next;
+ }
+ json_object_set_array_member(root_obj, _JSON_KEY_ASSERTIONS, assArray);
+
+ gsize len = 0;
+ char *json = json_generator_to_data(generator, &len);
+ if (json != NULL) {
+ *uaf_response = json;
+ _INFO("_uaf_composer_compose_uaf_process_response_reg return success");
+ _INFO("uaf_response=[%s]", json);
+
+ if (generator != NULL)
+ g_object_unref(generator);
+
+ return 0;
+ }
+
+ _INFO("_uaf_composer_compose_uaf_process_response_reg return fail");
+
+ if(generator!=NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+ return 0;
+
+CATCH:
+ if(generator!=NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if(root_obj!=NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+ return -1;
+#endif
}
int
_uaf_composer_compose_uaf_process_response_auth(_op_header_t *header, char *final_ch, GList *assertions, char **uaf_response)
{
+ _INFO("_uaf_composer_compose_uaf_process_response_auth");
return _uaf_composer_compose_uaf_process_response_reg(header, final_ch, assertions, uaf_response);
}
{
_INFO("_uaf_composer_compose_dereg_request");
+#ifdef WITH_JSON_BUILDER
+
/*Only 1.0 protocol support*/
JsonBuilder *builder = json_builder_new();
if (dereg_json != NULL) {
_INFO("_uaf_composer_compose_dereg_request return success");
_INFO("%s", dereg_json);
+
+ return dereg_json;
+ }
+
+ _INFO("_uaf_composer_compose_dereg_request return fail");
+ return NULL;
+
+#else
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if(__uaf_composer_compose_asm_init(&generator, &root_obj) != TRUE) {
+ _INFO("_uaf_composer_compose_asm_init fail");
+ goto CATCH;
+ }
+
+ /*header*/
+ JsonNode *_headerNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *_headerObject = json_object_new();
+
+ json_object_set_string_member(_headerObject, _JSON_KEY_APPID, uaf_res->header->app_id);
+ json_object_set_string_member(_headerObject, _JSON_KEY_OP, strdup(_UAF_OPERATION_NAME_KEY_DE_REG));
+ json_object_set_string_member(_headerObject, _JSON_KEY_SERVER_DATA, uaf_res->header->server_data);
+
+ JsonNode *upvNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *upvObject = json_object_new();
+ json_object_set_int_member(upvObject, _JSON_KEY_MAJOR, uaf_res->header->version->major);
+ json_object_set_int_member(upvObject, _JSON_KEY_MINOR, uaf_res->header->version->minor);
+ json_node_take_object(upvNode, upvObject);
+
+ json_object_set_member(_headerObject, _JSON_KEY_UPV, upvNode);
+ json_node_take_object(_headerNode, _headerObject);
+
+ json_object_set_member(root_obj, _JSON_KEY_HEADER, _headerNode);
+ /*header*/
+
+ _INFO("after header");
+
+
+ /*appID*/
+ if (uaf_res->header->app_id == NULL) {
+ _ERR("appID is missing");
+
+ g_object_unref(generator);
+ return NULL;
+ }
+ json_object_set_string_member(root_obj, _JSON_KEY_APPID, uaf_res->header->app_id);
+ /*appID*/
+
+ /*authenticators*/
+ JsonArray *authArray = json_array_new();
+ GList *assertions_iter = g_list_first(uaf_res->assertion_list);
+ while (assertions_iter != NULL) {
+
+ _auth_reg_assertion_t *ass_data = (_auth_reg_assertion_t*)(assertions_iter->data);
+
+ char *assrt = ass_data->assertion;
+
+ _INFO("%s", assrt);
+
+ _auth_reg_assertion_tlv_t *assrt_tlv = _tlv_util_decode_reg_assertion(assrt);
+ if (assrt_tlv == NULL) {
+ _ERR("Invalid assertion format");
+
+ g_object_unref(generator);
+ return NULL;
+ }
+
+ char *aaid = strdup(assrt_tlv->aaid);
+ JsonNode *authNode = json_node_new(JSON_NODE_OBJECT);
+ JsonObject *authObject = json_object_new();
+
+ if (aaid != NULL) {
+ json_object_set_string_member(authObject, _JSON_KEY_AAID, aaid);
+ _INFO("aaid=[%s]", aaid);
+ }
+
+ if (assrt_tlv->key_id != NULL) {
+ int inlen = assrt_tlv->key_id_len;
+ int enc_len = (4 * ((inlen + 2) / 3)) + 1;
+
+ unsigned char *key_id_enc = calloc(1, enc_len);
+
+ int r = _fido_b64url_encode(assrt_tlv->key_id, inlen, key_id_enc, &enc_len);
+
+ _INFO("_fido_b64url_encode len=[%d]", enc_len);
+
+ if ((key_id_enc != NULL) && (r == 0)) {
+
+ _INFO("_fido_b64url_encoded string=%s", key_id_enc);
+ json_object_set_string_member(authObject, _JSON_KEY_KEY_ID, (char *)key_id_enc);
+ _INFO("keyid=[%s]", key_id_enc);
+ }
+ }
+ json_node_take_object(authNode, authObject);
+ json_array_add_element(authArray, authNode);
+ assertions_iter = assertions_iter->next;
+ }
+ json_object_set_array_member(root_obj, _JSON_KEY_AUTHENTICATORS_SMALL, authArray);
+ /*authenticators*/
+
+ gsize len = 0;
+ char *dereg_json = json_generator_to_data(generator, &len);
+ if(generator!=NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+ if (dereg_json != NULL) {
+ _INFO("_uaf_composer_compose_dereg_request return success");
+ _INFO("%s", dereg_json);
+
return dereg_json;
}
+ return NULL;
+
+CATCH:
+ if(generator!=NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if(root_obj!=NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
_INFO("_uaf_composer_compose_dereg_request return fail");
return NULL;
+#endif
}
static _policy_t*
{
_INFO("_uaf_composer_compose_get_registrations_request");
+#ifdef WITH_JSON_BUILDER
+
JsonBuilder *builder = json_builder_new();
json_builder_begin_object(builder);
g_object_unref(gen);
return json;
+
+#else
+ JsonGenerator *generator = json_generator_new();
+ JsonObject *root_obj = json_object_new();
+
+ if(__uaf_composer_compose_asm_init(&generator, &root_obj) != TRUE) {
+ _INFO("_uaf_composer_compse_asm_init fail");
+ goto CATCH;
+ }
+
+ /*Version*/
+ JsonNode *jsonNode = NULL;
+ JsonObject *jsonObject = json_object_new();
+ json_object_set_int_member(jsonObject, _JSON_KEY_MAJOR, 1);
+ json_object_set_int_member(jsonObject, _JSON_KEY_MINOR, 0);
+ json_node_take_object(jsonNode, jsonObject);
+
+ json_object_set_member(root_obj, _JSON_KEY_ASM_VERSION, jsonNode);
+
+ /*authenticatorIndex*/
+ int auth_index_int = -1;
+ sscanf(auth_index, "%d", &auth_index_int);
+ json_object_set_int_member(root_obj, _JSON_KEY_AUTH_INDEX, auth_index_int);
+
+ /*requestType : "GetRegisterations" */
+ json_object_set_string_member(root_obj, _JSON_KEY_REQ_TYPE, _JSON_KEY_GET_REGS);
+
+ gsize len = 0;
+ char *get_reg_json = json_generator_to_data(generator, &len);
+
+ if(generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ return get_reg_json;
+
+CATCH:
+ if(generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if(root_obj != NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+
+ return NULL;
+#endif
}
int
}
*/
+
_fido_asm_proxy_t*
_parse_asm_conf_file(const char *file_name)
{
CATCH:
g_object_unref(parser);
return proxy;
+
}
#include <tizen.h>
#include <stdint.h>
+#ifndef WITH_JSON_BUILDER
+#define TIZEN_ERROR_FIDO -0x01030000
+#endif
+
/**
* @addtogroup CAPI_FIDO_MODULE
* @{
+IF(NOT DEFINED UI_PACKAGE_NAME)
+ SET(UI_PACKAGE_NAME "org.tizen.fidosvcui")
+ENDIF(NOT DEFINED UI_PACKAGE_NAME)
-SET (UI_PACKAGE_NAME "org.tizen.fidosvcui")
+SET(UI_PREFIX "/usr/apps/${UI_PACKAGE_NAME}")
-SET(UI_SRCS
- ${CMAKE_SOURCE_DIR}/fido_svc_ui/fido_ui_server.c
+IF(NOT DEFINED UI_BINDIR)
+ SET(UI_BINDIR "${UI_PREFIX}/bin")
+ENDIF(NOT DEFINED UI_BINDIR)
+
+IF(NOT DEFINED UI_RESDIR)
+ SET(UI_RESDIR "${UI_PREFIX}/res")
+ENDIF(NOT DEFINED UI_RESDIR)
+
+IF(NOT DEFINED UI_LOCALEDIR)
+ SET(UI_LOCALEDIR "${UI_PREFIX}/res/locale")
+ENDIF(NOT DEFINED UI_LOCALEDIR)
+
+IF(NOT DEFINED UI_MANIFESTDIR)
+ SET(UI_MANIFESTDIR "/usr/share/packages")
+ENDIF(NOT DEFINED UI_MANIFESTDIR)
+
+IF(NOT DEFINED UI_DESKTOP_ICONDIR)
+ SET(UI_DESKTOP_ICONDIR "/usr/share/icons/default/small")
+ENDIF(NOT DEFINED UI_DESKTOP_ICONDIR)
+
+IF(NOT DEFINED UI_DESKTOP_ICON)
+ SET(UI_DESKTOP_ICON ${UI_PACKAGE_NAME}.png)
+ENDIF(NOT DEFINED UI_DESKTOP_ICON)
+
+SET(UI_SRCS
+ ${CMAKE_SOURCE_DIR}/fido_svc_ui/fido_ui_server.c
)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common)
INCLUDE(FindPkgConfig)
pkg_check_modules(UI_PKGS REQUIRED
- elementary
- efl-extension
- capi-appfw-application
- capi-system-system-settings
- dlog
- json-glib-1.0
- glib-2.0
- gio-unix-2.0)
+ elementary
+ efl-extension
+ capi-appfw-application
+ capi-system-system-settings
+ dlog
+ json-glib-1.0
+ glib-2.0
+ gio-unix-2.0)
FOREACH(flag ${UI_PKGS_CFLAGS})
- SET(EXTRA_CFLGAS "${EXTRA_CFLGAS} ${flag}")
+ SET(EXTRA_CFLGAS "${EXTRA_CFLGAS} ${flag}")
ENDFOREACH(flag)
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_SOURCE_DIR}/common/fido-stub.c ${CMAKE_SOURCE_DIR}/common/fido-stub.h
TARGET_LINK_LIBRARIES(${UI_PACKAGE_NAME} "-pie" ${UI_PKGS_LDFLAGS})
CONFIGURE_FILE(${UI_PACKAGE_NAME}.xml.in ${UI_PACKAGE_NAME}.xml)
+if(USE_JSON_BUILDER)
INSTALL(TARGETS ${UI_PACKAGE_NAME} DESTINATION ${BIN_DIR})
-INSTALL(FILES ${UI_PACKAGE_NAME}.xml DESTINATION /opt/share/packages/)
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/fido_svc_ui/${UI_PACKAGE_NAME}.png DESTINATION /opt/share/icons/default/small/)
+INSTALL(FILES ${UI_PACKAGE_NAME}.xml DESTINATION ${MANIFEST_DIR})
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/fido_svc_ui/${UI_PACKAGE_NAME}.png DESTINATION ${ICON_DIR})
+else()
+INSTALL(TARGETS ${UI_PACKAGE_NAME} DESTINATION ${UI_BINDIR})
+INSTALL(FILES ${UI_PACKAGE_NAME}.xml DESTINATION ${UI_MANIFESTDIR})
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/fido_svc_ui/${UI_DESKTOP_ICON} DESTINATION ${UI_DESKTOP_ICONDIR})
+endif()
#include "fido_internal_types.h"
#define _FIDO_SERVICE_UI_DBUS_PATH "/org/tizen/fidosvcui"
+
#define _FIDO_SERVICE_PATH "/usr/bin/fido-service"
#define _FREEDESKTOP_SERVICE "org.freedesktop.DBus"
SAFE_DELETE(data);
}
+#ifdef WITH_JSON_BUILDER
static void
__add_string_to_json_object(JsonBuilder *json_obj, const char *key, const char *val)
{
json_builder_set_member_name(json_obj, key);
json_builder_add_int_value(json_obj, val);
}
+#endif
static void
__init_dbus(void)
char*
_create_json_response(ui_data_s *selected_auth)
{
- _INFO("_create_json_response");
+ _INFO("_create_json_response");
- /*Builder start*/
- JsonBuilder *builder = json_builder_new();
- json_builder_begin_object(builder);
+#ifdef WITH_JSON_BUILDER
- /*requestType*/
- __add_string_to_json_object(builder, UI_DATA_ASM_ID, selected_auth->asm_id);
- __add_string_to_json_object(builder, UI_DATA_AUTH_INDEX, selected_auth->auth_index);
- __add_string_to_json_object(builder, UI_DATA_LABEL, selected_auth->label);
- __add_int_to_json_object(builder, UI_DATA_ATT_TYPE, selected_auth->att_t);
+ /*Builder start*/
+ JsonBuilder *builder = json_builder_new();
+ json_builder_begin_object(builder);
- json_builder_end_object(builder);
- /*Builder end*/
+ /*requestType*/
+ __add_string_to_json_object(builder, UI_DATA_ASM_ID, selected_auth->asm_id);
+ __add_string_to_json_object(builder, UI_DATA_AUTH_INDEX, selected_auth->auth_index);
+ __add_string_to_json_object(builder, UI_DATA_LABEL, selected_auth->label);
+ __add_int_to_json_object(builder, UI_DATA_ATT_TYPE, selected_auth->att_t);
- JsonGenerator *gen = json_generator_new();
- JsonNode *root_builder = json_builder_get_root(builder);
- json_generator_set_root(gen, root_builder);
+ json_builder_end_object(builder);
+ /*Builder end*/
- json_node_free(root_builder);
- g_object_unref(builder);
+ JsonGenerator *gen = json_generator_new();
+ JsonNode *root_builder = json_builder_get_root(builder);
+ json_generator_set_root(gen, root_builder);
- gsize len = 0;
- char *json = json_generator_to_data(gen, &len);
- if (json != NULL) {
+ json_node_free(root_builder);
+ g_object_unref(builder);
- if (gen != NULL)
- g_object_unref(gen);
+ gsize len = 0;
+ char *json = json_generator_to_data(gen, &len);
+ if (json != NULL) {
- _INFO("%s", json);
- _INFO("_create_json_response end");
+ if (gen != NULL)
+ g_object_unref(gen);
- return json;
- }
+ _INFO("%s", json);
+ _INFO("_create_json_response end");
+
+ return json;
+ }
+
+ g_object_unref(gen);
+
+ _INFO("_create_json_response fail");
+ return NULL;
+
+#else
+
+ /*Builder start*/
+ JsonGenerator *generator = NULL;
+ JsonObject *root_obj = NULL;
+ JsonNode *root_node = NULL;
+
+ generator = json_generator_new();
+ if(generator == NULL) {
+ _INFO("json_generator_new is NULL");
+ goto CATCH;
+ }
+
+ root_obj = json_object_new();
+ if(root_obj == NULL) {
+ _INFO("json_object_new in NULL");
+ goto CATCH;
+ }
+
+ root_node = json_node_new(JSON_NODE_OBJECT);
+ if (root_node == NULL) {
+ _INFO("*json_node_new is NULL");
+ goto CATCH;
+ }
+
+ /*requestType*/
+ json_object_set_string_member(root_obj, UI_DATA_ASM_ID, selected_auth->asm_id);
+ json_object_set_string_member(root_obj, UI_DATA_AUTH_INDEX, selected_auth->auth_index);
+ json_object_set_string_member(root_obj, UI_DATA_LABEL, selected_auth->label);
+ json_object_set_int_member(root_obj, UI_DATA_ATT_TYPE, selected_auth->att_t);
+
+ json_node_take_object(root_node, root_obj);
+ json_generator_set_root(generator, root_node);
+ /*Builder end*/
+
+ char *json = json_generator_to_data(generator, NULL);
+
+ if (json != NULL) {
- g_object_unref(gen);
+ if (generator != NULL)
+ g_object_unref(generator);
- _INFO("_create_json_response fail");
- return NULL;
+ _INFO("%s", json);
+ _INFO("_create_json_response end");
+
+ return json;
+ }
+
+CATCH:
+ if (generator != NULL) {
+ g_object_unref(generator);
+ generator = NULL;
+ }
+
+ if (root_node != NULL) {
+ json_node_free(root_node);
+ root_node = NULL;
+ }
+
+ if (root_obj != NULL) {
+ g_object_unref(root_obj);
+ root_obj = NULL;
+ }
+ return NULL;
+#endif
+
+ return NULL;
}
void
_list_destroy(gpointer data)
{
- ui_data_s *list_data = (ui_data_s *) data;
- SAFE_DELETE(list_data->auth_index);
- SAFE_DELETE(list_data->label);
+ ui_data_s *list_data = (ui_data_s *) data;
+ SAFE_DELETE(list_data->auth_index);
+ SAFE_DELETE(list_data->label);
}
void
_hide_ui(void)
{
- elm_genlist_clear(ad->genlist);
- g_list_free_full(ad->ui_data_list, (GDestroyNotify) _list_destroy);
- ad->ui_data_list = NULL;
- evas_object_hide(ad->win);
+ elm_genlist_clear(ad->genlist);
+ g_list_free_full(ad->ui_data_list, (GDestroyNotify) _list_destroy);
+ ad->ui_data_list = NULL;
+ evas_object_hide(ad->win);
}
void genlist_select_cb(void *data, Evas_Object *obj, void *event_info)
{
- _INFO("genlist_select_cb");
+ _INFO("genlist_select_cb");
- if (data == NULL) {
- _INFO("data is NULL");
- return;
- }
+ if (data == NULL) {
+ _INFO("data is NULL");
+ return;
+ }
- if (event_info == NULL) {
- _INFO("event_info is NULL");
- return;
- }
+ if (event_info == NULL) {
+ _INFO("event_info is NULL");
+ return;
+ }
- ui_data_s *selected_auth = (ui_data_s*) data;
- auth_option_selected = TRUE;
+ ui_data_s *selected_auth = (ui_data_s*) data;
+ auth_option_selected = TRUE;
- Elm_Object_Item *item = (Elm_Object_Item *) event_info;
- char *sel_txt = (char *) elm_object_item_data_get(item);
+ Elm_Object_Item *item = (Elm_Object_Item *) event_info;
+ char *sel_txt = (char *) elm_object_item_data_get(item);
- if (!strcmp(sel_txt, selected_auth->label)) {
- char *response = _create_json_response(selected_auth);
- if (response != NULL) {
- _hide_ui();
+ if (!strcmp(sel_txt, selected_auth->label)) {
+ char *response = _create_json_response(selected_auth);
+ if (response != NULL) {
+ _hide_ui();
- _INFO("sending response to ui adaptor");
+ _INFO("sending response to ui adaptor");
__send_response_to_fido_svc(FIDO_ERROR_NONE, response);
SAFE_DELETE(response);
- }
- }
+ }
+ }
}
static char*
_item_label_get(void *data, Evas_Object *obj, const char *part)
{
- char buf[256];
- snprintf(buf, sizeof(buf), "%s", (char*) data);
- return strdup(buf);
+ char buf[256];
+ snprintf(buf, sizeof(buf), "%s", (char*) data);
+ return strdup(buf);
}
void
_auth_arr_cb(JsonArray *array, guint index, JsonNode *element_node, gpointer user_data)
{
- _INFO("_auth_arr_cb");
+ _INFO("_auth_arr_cb");
- JsonObject *obj = NULL;
- obj = json_node_get_object(element_node);
- if (!obj) {
- _ERR("json_node_get_object() failed");
- return;
- }
+ JsonObject *obj = NULL;
+ obj = json_node_get_object(element_node);
+ if (!obj) {
+ _ERR("json_node_get_object() failed");
+ return;
+ }
- ui_data_s *ui_data = (ui_data_s *) calloc(1, sizeof(ui_data_s));
- if (!ui_data) {
- _ERR("Out of memory");
- return;
- }
+ ui_data_s *ui_data = (ui_data_s *) calloc(1, sizeof(ui_data_s));
+ if (!ui_data) {
+ _ERR("Out of memory");
+ return;
+ }
const char *asm_id = json_object_get_string_member(obj, UI_DATA_ASM_ID);
if (!asm_id) {
return;
}
- const char *auth_idx = NULL;
- auth_idx = json_object_get_string_member(obj, UI_DATA_AUTH_INDEX);
- if (!auth_idx) {
- _ERR("json_object_get_string_member() failed");
+ const char *auth_idx = NULL;
+ auth_idx = json_object_get_string_member(obj, UI_DATA_AUTH_INDEX);
+ if (!auth_idx) {
+ _ERR("json_object_get_string_member() failed");
__free_ui_data(ui_data);
- return;
- }
+ return;
+ }
- const char *label = NULL;
- label = json_object_get_string_member(obj, UI_DATA_LABEL);
+ const char *label = NULL;
+ label = json_object_get_string_member(obj, UI_DATA_LABEL);
- int att = -1;
- att = json_object_get_int_member(obj, UI_DATA_ATT_TYPE);
+ int att = -1;
+ att = json_object_get_int_member(obj, UI_DATA_ATT_TYPE);
ui_data->asm_id = strdup(asm_id);
- ui_data->auth_index = strdup(auth_idx);
+ ui_data->auth_index = strdup(auth_idx);
if (label == NULL) {
ui_data->label = calloc(1, 128);
snprintf(ui_data->label, 127, "%s", "Unknown Authenticator");
else
ui_data->label = strdup(label);
- ui_data->att_t = att;
- ad->ui_data_list = g_list_append(ad->ui_data_list, ui_data);
+ ui_data->att_t = att;
+ ad->ui_data_list = g_list_append(ad->ui_data_list, ui_data);
_INFO("Adding to ui_data list | auth_index %s | label %s | att_type %d",
auth_idx, ui_data->label, att);
- elm_genlist_item_append(ad->genlist, ad->itc, ui_data->label, NULL,
- ELM_GENLIST_ITEM_NONE, genlist_select_cb, ui_data);
+ elm_genlist_item_append(ad->genlist, ad->itc, ui_data->label, NULL,
+ ELM_GENLIST_ITEM_NONE, genlist_select_cb, ui_data);
}
static void
_parse_json_ui_in(const char *ui_auth_json)
{
- _INFO("_parse_json_ui_in data %s", ui_auth_json);
-
- char * ui_auth = strdup(ui_auth_json);
- GError *parse_err = NULL;
- JsonParser *parser = NULL;
- JsonNode *root = NULL;
- JsonArray *auth_data_arr = NULL;
-
- parser = json_parser_new();
- if (!parser) {
- _ERR("json_parser_new failed");
- goto CATCH;
- }
+ _INFO("_parse_json_ui_in data %s", ui_auth_json);
+
+ char * ui_auth = strdup(ui_auth_json);
+ GError *parse_err = NULL;
+ JsonParser *parser = NULL;
+ JsonNode *root = NULL;
+ JsonArray *auth_data_arr = NULL;
+
+ parser = json_parser_new();
+ if (!parser) {
+ _ERR("json_parser_new failed");
+ goto CATCH;
+ }
- json_parser_load_from_data(parser, ui_auth, -1, &parse_err);
- if (parse_err != NULL) {
- _ERR("json parse failure");
- goto CATCH;
- }
+ json_parser_load_from_data(parser, ui_auth, -1, &parse_err);
+ if (parse_err != NULL) {
+ _ERR("json parse failure");
+ goto CATCH;
+ }
- root = json_parser_get_root(parser);
- if (!root) {
- _ERR("json_parser_get_root() failed");
- goto CATCH;
- }
+ root = json_parser_get_root(parser);
+ if (!root) {
+ _ERR("json_parser_get_root() failed");
+ goto CATCH;
+ }
- auth_data_arr = json_node_get_array(root);
- if (!auth_data_arr) {
- _ERR("json_node_get_array() failed");
- goto CATCH;
- }
+ auth_data_arr = json_node_get_array(root);
+ if (!auth_data_arr) {
+ _ERR("json_node_get_array() failed");
+ goto CATCH;
+ }
- /* Genlist Item */
- ad->itc = elm_genlist_item_class_new();
- ad->itc->item_style = "default";
- ad->itc->func.text_get = _item_label_get;
- ad->itc->func.content_get = NULL;
- ad->itc->func.state_get = NULL;
+ /* Genlist Item */
+ ad->itc = elm_genlist_item_class_new();
+ ad->itc->item_style = "default";
+ ad->itc->func.text_get = _item_label_get;
+ ad->itc->func.content_get = NULL;
+ ad->itc->func.state_get = NULL;
- json_array_foreach_element(auth_data_arr, _auth_arr_cb, NULL);
+ json_array_foreach_element(auth_data_arr, _auth_arr_cb, NULL);
-CATCH:
+ CATCH:
if (parser != NULL) {
g_object_unref(parser);
parser = NULL;
}
- if (parse_err != NULL) {
- g_error_free(parse_err);
- parse_err = NULL;
- }
+ if (parse_err != NULL) {
+ g_error_free(parse_err);
+ parse_err = NULL;
+ }
- SAFE_DELETE(ui_auth);
+ SAFE_DELETE(ui_auth);
- return;
+ return;
}
// TODO button callback
*/
static void
-_win_back_cb(void *data, Evas_Object *obj, void *event_info)
+_win_back_cb(void *data, Evas_Object *obj, void *event_info)
{
if (auth_option_selected == FALSE) {
_ERR("Authenticator not selected by user");
static void
_create_ui(void)
{
- _INFO("_create_ui");
+ _INFO("_create_ui");
- /* Window */
- //ad->win = elm_win_add(NULL, UI_SVC_PACKAGE, ELM_WIN_BASIC);
+ /* Window */
+ //ad->win = elm_win_add(NULL, UI_SVC_PACKAGE, ELM_WIN_BASIC);
ad->win = elm_win_util_standard_add(_UI_SVC_PACKAGE, "Authenticator Selection UI");
- if (ad->win != NULL)
- _INFO("elm_win_util_standard_add successful");
- else
- _ERR("elm_win_util_standard_add failed");
-
- elm_win_autodel_set(ad->win, EINA_TRUE);
-
- if (elm_win_wm_rotation_supported_get(ad->win)) {
- int rots[4] = { 0, 90, 180, 270 };
- elm_win_wm_rotation_available_rotations_set(ad->win,
- (const int *) (&rots), 4);
- }
+ if (ad->win != NULL)
+ _INFO("elm_win_util_standard_add successful");
+ else
+ _ERR("elm_win_util_standard_add failed");
+
+ elm_win_autodel_set(ad->win, EINA_TRUE);
+
+ if (elm_win_wm_rotation_supported_get(ad->win)) {
+ int rots[4] = { 0, 90, 180, 270 };
+ elm_win_wm_rotation_available_rotations_set(ad->win,
+ (const int *) (&rots), 4);
+ }
- eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, _win_back_cb, ad);
- evas_object_smart_callback_add(ad->win, "unfocused", _win_back_cb, NULL);
-
- /* Conformant */
- ad->conform = elm_conformant_add(ad->win);
- elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
- elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
- evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND,
- EVAS_HINT_EXPAND);
- elm_win_resize_object_add(ad->win, ad->conform);
- evas_object_show(ad->conform);
-
- /* Naviframe */
- ad->nf = elm_naviframe_add(ad->conform);
- elm_object_content_set(ad->conform, ad->nf);
- evas_object_show(ad->nf);
-
- /* Box */
- ad->box = elm_box_add(ad->nf);
-
- /* Genlist */
- ad->genlist = elm_genlist_add(ad->box);
- elm_genlist_homogeneous_set(ad->genlist, EINA_TRUE);
-
- /* Radio */
- Evas_Object *radio_main = elm_radio_add(ad->genlist);
- elm_radio_state_value_set(radio_main, 0);
- elm_radio_value_set(radio_main, 0);
- evas_object_data_set(ad->genlist, "radio_main", radio_main);
-
- evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND,
- EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(ad->genlist, EVAS_HINT_FILL,
- EVAS_HINT_FILL);
- evas_object_show(ad->genlist);
- elm_box_pack_end(ad->box, ad->genlist);
-
- //~ /* Button */ // TODO check button visibility
- //~ ad->btn = elm_button_add(ad->box);
- //~ elm_object_text_set(ad->btn, "OK");
- //~ evas_object_size_hint_weight_set(ad->btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- //~ evas_object_size_hint_align_set(ad->btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
-
- //~ Evas_Object *btn_bg = elm_bg_add(ad->btn);
- //~ elm_bg_color_set(btn_bg, 90, 160, 200);
-
- //~ evas_object_smart_callback_add(ad->btn, "clicked", btn_clicked_cb, ad);
- //~ evas_object_show(ad->btn);
- //~ elm_box_pack_end(ad->box, ad->btn);
-
-
- elm_naviframe_item_push(ad->nf, "Select Authenticator",
- NULL, NULL, ad->box, NULL);
-
- /* Keep window hidden after base gui is set up */
+ eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, _win_back_cb, ad);
+ evas_object_smart_callback_add(ad->win, "unfocused", _win_back_cb, NULL);
+
+ /* Conformant */
+ ad->conform = elm_conformant_add(ad->win);
+ elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
+ elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
+ evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(ad->win, ad->conform);
+ evas_object_show(ad->conform);
+
+ /* Naviframe */
+ ad->nf = elm_naviframe_add(ad->conform);
+ elm_object_content_set(ad->conform, ad->nf);
+ evas_object_show(ad->nf);
+
+ /* Box */
+ ad->box = elm_box_add(ad->nf);
+
+ /* Genlist */
+ ad->genlist = elm_genlist_add(ad->box);
+ elm_genlist_homogeneous_set(ad->genlist, EINA_TRUE);
+
+ /* Radio */
+ Evas_Object *radio_main = elm_radio_add(ad->genlist);
+ elm_radio_state_value_set(radio_main, 0);
+ elm_radio_value_set(radio_main, 0);
+ evas_object_data_set(ad->genlist, "radio_main", radio_main);
+
+ evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ad->genlist, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_show(ad->genlist);
+ elm_box_pack_end(ad->box, ad->genlist);
+
+ //~ /* Button */ // TODO check button visibility
+ //~ ad->btn = elm_button_add(ad->box);
+ //~ elm_object_text_set(ad->btn, "OK");
+ //~ evas_object_size_hint_weight_set(ad->btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ //~ evas_object_size_hint_align_set(ad->btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ //~ Evas_Object *btn_bg = elm_bg_add(ad->btn);
+ //~ elm_bg_color_set(btn_bg, 90, 160, 200);
+
+ //~ evas_object_smart_callback_add(ad->btn, "clicked", btn_clicked_cb, ad);
+ //~ evas_object_show(ad->btn);
+ //~ elm_box_pack_end(ad->box, ad->btn);
+
+
+ elm_naviframe_item_push(ad->nf, "Select Authenticator",
+ NULL, NULL, ad->box, NULL);
+
+ /* Keep window hidden after base gui is set up */
//evas_object_hide(ad->win);
-
+
}
static bool
system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
elm_language_set(locale);
free(locale);
- return;
- }
+ return;
+}
static void
ui_app_orient_changed(app_event_info_h event_info, void *user_data)
{
- return;
- }
+ return;
+}
static void
ui_app_region_changed(app_event_info_h event_info, void *user_data)
static void
ui_app_low_battery(app_event_info_h event_info, void *user_data)
{
-
- }
+}
static void
ui_app_low_memory(app_event_info_h event_info, void *user_data)
Source0: fido-client-%{version}.tar.gz
Source1: org.tizen.fido.service
Source2: org.tizen.fido.conf
+%if "%{?tizen_version}" == "3.0"
Source3: fido.service
+%else
+Source3: org.tizen.fido.service
+%endif
Source4: org.tizen.dummyasm.service
Source5: org.tizen.dummyasm.conf
BuildRequires: pkgconfig(glib-2.0)
BuildRequires: pkgconfig(dlog)
BuildRequires: pkgconfig(capi-base-common)
-BuildRequires: pkgconfig(glib-2.0) >= 2.26
+BuildRequires: pkgconfig(glib-2.0) >= 2.26
BuildRequires: pkgconfig(gio-unix-2.0)
+
+%if "%{?tizen_version}" == "3.0"
BuildRequires: pkgconfig(libtzplatform-config)
BuildRequires: pkgconfig(cynara-client)
BuildRequires: pkgconfig(cynara-session)
BuildRequires: pkgconfig(cynara-creds-gdbus)
+%endif
+
BuildRequires: pkgconfig(pkgmgr-info)
BuildRequires: pkgconfig(aul)
BuildRequires: pkgconfig(json-glib-1.0)
%description devel
Development files for %{name}
+%if "%{?tizen_version}" == "3.0"
%define _pkg_dir %{TZ_SYS_RO_APP}/org.tizen.fidosvcui
%define _bin_dir %{_pkg_dir}/bin
%define _lib_dir %{_pkg_dir}/lib
%define _locale_dir %{_res_dir}/locale
%define _manifest_dir %{TZ_SYS_RO_PACKAGES}
%define _icon_dir %{TZ_SYS_RO_ICONS}/default/small
+%endif
%prep
%setup -q
export CFLAGS="${CFLAGS} -fPIC -fvisibility=hidden"
+%if "%{?tizen_version}" == "3.0"
+_JSON_BUILDER="YES"
+%else
+_JSON_BUILDER="NO"
+%endif
+
+%if "%{?tizen_version}" == "3.0"
cmake . \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DLIBDIR=%{_libdir} \
-DRES_DIR=%{_res_dir} \
-DLOCALE_DIR=%{_locale_dir} \
-DMANIFEST_DIR=%{_manifest_dir} \
--DICON_DIR=%{_icon_dir}
+-DICON_DIR=%{_icon_dir} \
+-DUSE_JSON_BUILDER:BOOL=${_JSON_BUILDER}
+
+%else
+cmake . \
+-DCMAKE_INSTALL_PREFIX=%{_prefix} \
+-DLIBDIR=%{_libdir} \
+-DINCLUDEDIR=%{_includedir} \
+-DUSE_JSON_BUILDER:BOOL=${_JSON_BUILDER}
+%endif
make %{?jobs:-j%jobs}
+%if "%{?tizen_version}" == "3.0"
%install
rm -rf %{buildroot}
install -m 644 %SOURCE4 %{buildroot}%{_unitdir}/org.tizen.dummyasm.service
%install_service multi-user.target.wants org.tizen.dummyasm.service
+%else
+%install
+rm -rf %{buildroot}
+
+%make_install
+
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+cp -af %{SOURCE1} %{buildroot}%{_libdir}/systemd/system/
+
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+ln -s %SOURCE3 %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/org.tizen.fido.service
+
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+cp -af %{SOURCE4} %{buildroot}%{_libdir}/systemd/system/
+
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+ln -s %SOURCE4 %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/org.tizen.dummyasm.service
+%endif
+
+
install -m 0644 test/Dummy_ASM_DBUS/dummy_asm.json %{buildroot}%{_libdir}/fido/asm/dummy_asm.json
%make_install
%files
%{_libdir}/*.so.*
%manifest fido.manifest
+
+%if "%{?tizen_version}" == "3.0"
%config %{_sysconfdir}/dbus-1/system.d/org.tizen.fido.conf
+%endif
+
%{_bindir}/fido-service
+
+%if "%{?tizen_version}" == "3.0"
%attr(0644,root,root) %{_unitdir}/fido.service
%attr(0644,root,root) %{_unitdir}/multi-user.target.wants/fido.service
%attr(0644,root,root) /usr/share/dbus-1/system-services/org.tizen.fido.service
+%else
+%{_libdir}/systemd/system/org.tizen.fido.service
+%{_libdir}/systemd/system/multi-user.target.wants/org.tizen.fido.service
+%{_datadir}/dbus-1/services/org.tizen.fido.service
+%endif
+
%files devel
%defattr(-,root,root,-)
%{_libdir}/*.so
Summary: FIDO Service UI
Group: Social & Content/API
-BuildRequires: cmake
-BuildRequires: pkgconfig(capi-appfw-application)
-BuildRequires: pkgconfig(capi-system-system-settings)
-BuildRequires: pkgconfig(elementary)
-BuildRequires: pkgconfig(efl-extension)
-BuildRequires: pkgconfig(dlog)
+BuildRequires: cmake
+BuildRequires: pkgconfig(capi-appfw-application)
+BuildRequires: pkgconfig(capi-system-system-settings)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(efl-extension)
+BuildRequires: pkgconfig(dlog)
BuildRequires: pkgconfig(bundle)
-BuildRequires: pkgconfig(json-glib-1.0)
-BuildRequires: pkgconfig(glib-2.0) >= 2.26
+BuildRequires: pkgconfig(json-glib-1.0)
+BuildRequires: pkgconfig(glib-2.0) >= 2.26
BuildRequires: pkgconfig(gio-unix-2.0)
+
+%if "%{?tizen_version}" == "3.0"
BuildRequires: pkgconfig(libtzplatform-config)
+%endif
+
Requires: fido-client
%description -n org.tizen.fidosvcui
%files -n org.tizen.fidosvcui
%defattr(-,root,root,-)
+
+%if "%{?tizen_version}" == "3.0"
%manifest org.tizen.fidosvcui.manifest
%{TZ_SYS_RO_APP}/org.tizen.fidosvcui/bin/*
-%{TZ_SYS_SHARE}/packages/org.tizen.fidosvcui.xml
-%{TZ_SYS_SHARE}/icons/default/small/org.tizen.fidosvcui.png
+%{TZ_SYS_RO_PACKAGES}/org.tizen.fidosvcui.xml
+%{TZ_SYS_RO_ICONS}/default/small/org.tizen.fidosvcui.png
+
+%else
+%manifest org.tizen.fidosvcui.manifest
+/usr/apps/org.tizen.fidosvcui/bin/*
+##/usr/apps/org.tizen.fidosvcui/res/*
+/usr/share/packages/org.tizen.fidosvcui.xml
+/usr/share/icons/default/small/org.tizen.fidosvcui.png
+%endif
#################################################################################
# FIDO Dummy ASM
BuildRequires: pkgconfig(json-glib-1.0)
BuildRequires: pkgconfig(glib-2.0) >= 2.26
BuildRequires: pkgconfig(gio-unix-2.0)
-BuildRequires: pkgconfig(libtzplatform-config)
+
+%if "%{?tizen_version}" == "3.0"
+BuildRequires: pkgconfig(libtzplatform-config)
+%endif
+
Requires: fido-client
%description -n dummyasm
%files -n dummyasm
%manifest dummyasm.manifest
+
+%if "%{?tizen_version}" == "3.0"
%config %{_sysconfdir}/dbus-1/system.d/org.tizen.dummyasm.conf
%{_bindir}/dummyasm-service
%attr(0644,root,root) %{_unitdir}/org.tizen.dummyasm.service
%attr(0644,root,root) %{_unitdir}/multi-user.target.wants/org.tizen.dummyasm.service
%attr(0644,root,root) /usr/share/dbus-1/system-services/org.tizen.dummyasm.service
%{_libdir}/fido/asm/dummy_asm.json
+
+%else
+%{_bindir}/dummyasm-service
+%attr(0644,root,root) %{_libdir}/systemd/system/org.tizen.dummyasm.service
+%attr(0644,root,root) %{_libdir}/systemd/system/multi-user.target.wants/org.tizen.dummyasm.service
+%attr(0644,root,root) %{_datadir}/dbus-1/services/org.tizen.dummyasm.service
+%{_libdir}/fido/asm/dummy_asm.json
+%endif
SET(SVC_DAEMON fido-service)
INCLUDE(FindPkgConfig)
+
+if(USE_JSON_BUILDER)
pkg_check_modules(SERVER_pkgs REQUIRED
dlog
glib-2.0
capi-base-common
json-glib-1.0
capi-appfw-application
- aul
+ aul
libsoup-2.4
capi-appfw-app-manager
openssl
bundle
- cynara-client
- cynara-session
- cynara-creds-gdbus
- libtzplatform-config
+ cynara-client
+ cynara-session
+ cynara-creds-gdbus
+ libtzplatform-config
)
+else()
+pkg_check_modules(SERVER_pkgs REQUIRED
+ dlog
+ glib-2.0
+ gio-unix-2.0
+ capi-base-common
+ json-glib-1.0
+ capi-appfw-application
+ aul
+ libsoup-2.4
+ capi-appfw-app-manager
+ openssl
+ bundle
+)
+endif()
FOREACH(flag ${SERVER_pkgs_CFLAGS})
- SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)
SET(SERVER_SRCS
- fido_server.c
+ fido_server.c
fido_asm_plugin_manager.c
fido_uaf_policy_checker.c
fido_selection_ui_adaptor.c
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/common/
COMMAND gdbus-codegen --interface-prefix org.tizen. --generate-c-code fido-stub ${CMAKE_SOURCE_DIR}/common/dbus_interfaces/fido.xml
COMMENT "Generating FIDO GDBus stubs........................")
-
+
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall -Werror")
SET(CMAKE_LDFLAGS "-Wl,-zdefs")
INSTALL(TARGETS ${SVC_DAEMON} DESTINATION bin)
+if(USE_JSON_BUILDER)
+add_definitions(-DWITH_JSON_BUILDER)
+else()
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/packaging/org.tizen.fido.service DESTINATION share/dbus-1/services)
+endif()
+
soup_uri_free(parsed_uri);
+#ifdef WITH_JSON_HANDLER
SoupSession *session = soup_session_new_with_options(
SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_PROXY_RESOLVER_DEFAULT,
SOUP_SESSION_SSL_USE_SYSTEM_CA_FILE, TRUE,
SOUP_SESSION_TIMEOUT, _MAX_NW_TIME_OUT,
NULL);
+#else
+ SoupSession *session = soup_session_async_new_with_options(
+ SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_PROXY_RESOLVER_DEFAULT,
+ SOUP_SESSION_SSL_USE_SYSTEM_CA_FILE, TRUE,
+ SOUP_SESSION_TIMEOUT, _MAX_NW_TIME_OUT,
+ NULL);
+#endif
bool ssl_strict = FALSE;//changed to make sure https cert errors dont occur, only for testing
g_object_set(session, "ssl-strict", ssl_strict, NULL);
* limitations under the License.
*
*/
+#include <sys/types.h>
+#include <dirent.h>
#include <app.h>
#include <stdio.h>
#include "fido_privilege_checker.h"
#include "fido_logs.h"
+#ifdef WITH_JSON_BUILDER
#include <cynara-client.h>
#include <cynara-session.h>
#include <cynara-creds-gdbus.h>
+static cynara *__cynara = NULL;
+#endif
#define _DISABLE_PRIV_CHECK
-static cynara *__cynara = NULL;
+#ifdef WITH_JSON_BUILDER
static guint
_get_client_pid(GDBusMethodInvocation* invoc)
{
- const char *name = NULL;
- name = g_dbus_method_invocation_get_sender(invoc);
- if (name == NULL)
- {
- _ERR("g_dbus_method_invocation_get_sender failed");
- return -1;
- }
- _INFO("sender=[%s]", name);
-
-
- guint pid = -1;
- GError *error = NULL;
- GVariant *_ret;
-
- _INFO("calling GetConnectionUnixProcessID");
-
- GDBusConnection* conn = g_dbus_method_invocation_get_connection(invoc);
- _ret = g_dbus_connection_call_sync(conn,
- "org.freedesktop.DBus",
- "/org/freedesktop/DBus",
- "org.freedesktop.DBus",
- "GetConnectionUnixProcessID",
- g_variant_new("(s)", name),
- NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
-
- if (_ret != NULL) {
- g_variant_get(_ret, "(u)", &pid);
- g_variant_unref(_ret);
- }
-
- _INFO("process Id = [%u]", pid);
- return pid;
+ const char *name = NULL;
+ name = g_dbus_method_invocation_get_sender(invoc);
+ if (name == NULL)
+ {
+ _ERR("g_dbus_method_invocation_get_sender failed");
+ return -1;
+ }
+ _INFO("sender=[%s]", name);
+
+
+ guint pid = -1;
+ GError *error = NULL;
+ GVariant *_ret;
+
+ _INFO("calling GetConnectionUnixProcessID");
+
+ GDBusConnection* conn = g_dbus_method_invocation_get_connection(invoc);
+ _ret = g_dbus_connection_call_sync(conn,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "GetConnectionUnixProcessID",
+ g_variant_new("(s)", name),
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (_ret != NULL) {
+ g_variant_get(_ret, "(u)", &pid);
+ g_variant_unref(_ret);
+ }
+
+ _INFO("process Id = [%u]", pid);
+ return pid;
}
static int
__check_privilege_by_cynara(const char *client, const char *session, const char *user, const char *privilege)
{
- int ret;
- char err_buf[128] = {0,};
-
- ret = cynara_check(__cynara, client, session, user, privilege);
- switch (ret) {
- case CYNARA_API_ACCESS_ALLOWED:
- _DBG("cynara_check success");
- return FIDO_ERROR_NONE;
-
- case CYNARA_API_ACCESS_DENIED:
- _ERR("cynara_check permission deined, privilege=%s, error = CYNARA_API_ACCESS_DENIED", privilege);
- return FIDO_ERROR_PERMISSION_DENIED;
-
- default:
- cynara_strerror(ret, err_buf, sizeof(err_buf));
- _ERR("cynara_check error : %s, privilege=%s, ret = %d", err_buf, privilege, ret);
- return FIDO_ERROR_PERMISSION_DENIED;
- }
+ #ifdef WITH_JSON_BUILDER
+
+ int ret;
+ char err_buf[128] = {0,};
+
+ ret = cynara_check(__cynara, client, session, user, privilege);
+ switch (ret) {
+ case CYNARA_API_ACCESS_ALLOWED:
+ _DBG("cynara_check success");
+ return FIDO_ERROR_NONE;
+
+ case CYNARA_API_ACCESS_DENIED:
+ _ERR("cynara_check permission deined, privilege=%s, error = CYNARA_API_ACCESS_DENIED", privilege);
+ return FIDO_ERROR_PERMISSION_DENIED;
+
+ default:
+ cynara_strerror(ret, err_buf, sizeof(err_buf));
+ _ERR("cynara_check error : %s, privilege=%s, ret = %d", err_buf, privilege, ret);
+ return FIDO_ERROR_PERMISSION_DENIED;
+ }
+
+ return FIDO_ERROR_NONE;
+ #endif
+
+ return FIDO_ERROR_NONE;
}
static int
__get_information_for_cynara_check(GDBusMethodInvocation *invocation, char **client, char **user, char **session)
{
- GDBusConnection *gdbus_conn = NULL;
- char* sender = NULL;
- int ret = -1;
-
- gdbus_conn = g_dbus_method_invocation_get_connection(invocation);
- if(gdbus_conn == NULL) {
- _ERR("g_dbus_method_invocation_get_connection failed");
- return -1;
- }
-
- sender = (char*) g_dbus_method_invocation_get_sender(invocation);
- if (sender == NULL) {
- _ERR("g_dbus_method_invocation_get_sender failed");
- return -1;
- }
-
- ret = cynara_creds_gdbus_get_user(gdbus_conn, sender, USER_METHOD_DEFAULT, user);
- if (ret != CYNARA_API_SUCCESS) {
- _ERR("cynara_creds_gdbus_get_user failed, ret = %d", ret);
- return -1;
- }
-
- ret = cynara_creds_gdbus_get_client(gdbus_conn, sender, CLIENT_METHOD_DEFAULT, client);
- if (ret != CYNARA_API_SUCCESS) {
- _ERR("cynara_creds_gdbus_get_client failed, ret = %d", ret);
- return -1;
- }
-
- guint pid = _get_client_pid(invocation);
- _INFO("client Id = [%u]", pid);
-
- *session = cynara_session_from_pid(pid);
- if (*session == NULL) {
- _ERR("cynara_session_from_pid failed");
- return -1;
- }
- return FIDO_ERROR_NONE;
+ #ifdef WITH_JSON_BUILDER
+
+ GDBusConnection *gdbus_conn = NULL;
+ char* sender = NULL;
+ int ret = -1;
+
+ gdbus_conn = g_dbus_method_invocation_get_connection(invocation);
+ if(gdbus_conn == NULL) {
+ _ERR("g_dbus_method_invocation_get_connection failed");
+ return -1;
+ }
+
+ sender = (char*) g_dbus_method_invocation_get_sender(invocation);
+ if (sender == NULL) {
+ _ERR("g_dbus_method_invocation_get_sender failed");
+ return -1;
+ }
+
+ ret = cynara_creds_gdbus_get_user(gdbus_conn, sender, USER_METHOD_DEFAULT, user);
+ if (ret != CYNARA_API_SUCCESS) {
+ _ERR("cynara_creds_gdbus_get_user failed, ret = %d", ret);
+ return -1;
+ }
+
+ ret = cynara_creds_gdbus_get_client(gdbus_conn, sender, CLIENT_METHOD_DEFAULT, client);
+ if (ret != CYNARA_API_SUCCESS) {
+ _ERR("cynara_creds_gdbus_get_client failed, ret = %d", ret);
+ return -1;
+ }
+
+ guint pid = _get_client_pid(invocation);
+ _INFO("client Id = [%u]", pid);
+
+ *session = cynara_session_from_pid(pid);
+ if (*session == NULL) {
+ _ERR("cynara_session_from_pid failed");
+ return -1;
+ }
+ return FIDO_ERROR_NONE;
+ #endif
+
+ return FIDO_ERROR_NONE;
}
+#endif
bool
is_allowed_to_call(GDBusMethodInvocation *invocation, const char* privilege)
{
- int ret = -1;
-
- if (__cynara == NULL) {
- ret = cynara_initialize(&__cynara, NULL);
- if(ret != CYNARA_API_SUCCESS) {
- _ERR("CYNARA Initialization fail");
- return false;
- }
- }
-
- char *client = NULL;
- char *session = NULL;
- char *user = NULL;
-
- ret = __get_information_for_cynara_check(invocation, &client, &user, &session);
- if ( ret != FIDO_ERROR_NONE) {
- _ERR("__get_information_for_cynara_check failed");
- g_free(client);
- g_free(user);
- SAFE_DELETE(session);
-
- return false;
- }
-
- ret = __check_privilege_by_cynara(client, session, user, privilege);
-
- /*TODO enable after smack is defined*/
-#ifndef _DISABLE_PRIV_CHECK
- if ( ret != FIDO_ERROR_NONE) {
- _ERR("__check_privilege_by_cynara failed, ret = %d", ret);
- g_free(client);
- g_free(user);
- SAFE_DELETE(session);
-
- return false;
- }
-#endif
- g_free(client);
- g_free(user);
- SAFE_DELETE(session);
-
- return true;
+ #ifdef WITH_JSON_BUILDER
+
+ int ret = -1;
+
+ if (__cynara == NULL) {
+ ret = cynara_initialize(&__cynara, NULL);
+ if(ret != CYNARA_API_SUCCESS) {
+ _ERR("CYNARA Initialization fail");
+ return false;
+ }
+ }
+
+ char *client = NULL;
+ char *session = NULL;
+ char *user = NULL;
+
+ ret = __get_information_for_cynara_check(invocation, &client, &user, &session);
+ if ( ret != FIDO_ERROR_NONE) {
+ _ERR("__get_information_for_cynara_check failed");
+ g_free(client);
+ g_free(user);
+ SAFE_DELETE(session);
+
+ return false;
+ }
+
+ ret = __check_privilege_by_cynara(client, session, user, privilege);
+
+ /*TODO enable after smack is defined*/
+ #ifndef _DISABLE_PRIV_CHECK
+ if ( ret != FIDO_ERROR_NONE) {
+ _ERR("__check_privilege_by_cynara failed, ret = %d", ret);
+ g_free(client);
+ g_free(user);
+ SAFE_DELETE(session);
+
+ return false;
+ }
+ #endif
+ g_free(client);
+ g_free(user);
+ SAFE_DELETE(session);
+
+ return true;
+ #endif
+
+ return true;
}
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common)
-ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_SOURCE_DIR}/common/dummy-asm-stub.c ${CMAKE_SOURCE_DIR}/common/dummy-asm-stub.h
+ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_SOURCE_DIR}/common/dummy-asm-stub.c ${CMAKE_SOURCE_DIR}/common/dummy-asm-stub.h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/common/
COMMAND gdbus-codegen --interface-prefix org.tizen. --generate-c-code dummy-asm-stub ${CMAKE_SOURCE_DIR}/common/dbus_interfaces/dummyasm.xml
COMMENT "Generating Dummy ASM GDBus stubs........................")
-
+
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Wall -Werror")
SET(CMAKE_LDFLAGS "-Wl,-zdefs")
SET(DUMMY_ASM_SRCS
- dummy_asm_server.c
+ dummy_asm_server.c
)
ADD_EXECUTABLE(${ASM_DAEMON} ${DUMMY_ASM_SRCS} ${CMAKE_SOURCE_DIR}/common/dummy-asm-stub.c)
TARGET_LINK_LIBRARIES(${ASM_DAEMON} ${ASM_PKGS_LDFLAGS})
INSTALL(TARGETS ${ASM_DAEMON} DESTINATION bin)
+
+if(USE_JSON_BUILDER)
+else()
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/packaging/org.tizen.dummyasm.service DESTINATION share/dbus-1/services)
+endif()
+
INSTALL(FILES ${CMAKE_SOURCE_DIR}/test/Dummy_ASM_DBUS/dummy_asm.json DESTINATION ${LIBDIR}/fido/asm/)
[
{
"aaid": [
- "0000#C001"
+ "0001#8001"
]
}
],
[
{
"aaid": [
- "53EC#3101"
+ "DDDD#F001"
]
}
]
},
"authenticators": [
{
- "aaid": "53EC#3101",
+ "aaid": "0001#8001",
"keyID": "uWrbo_8JI1HmPESrNAStTVV8ZbBrzLsf_kZu1QKX2YY"
}
]
[
{
"aaid": [
- "0000#C001"
+ "0001#8001"
]
}
],
[
{
"aaid": [
- "53EC#3101"
+ "DDDD#F001"
]
}
]
#include <stdlib.h>
#include <glib.h>
-static char *json_reg = "[ { \"header\": { \"upv\": { \"major\": 1, \"minor\": 0 },\"op\":\"Reg\", \"serverData\": \"nwV8EPqS5raZdAgH3GD9Z-ytCA9MkiiWaCsr1GHHNJ2yUh3HaV1HHxd4Z67FefJOD5sQYZvipfg5BavhdWPMecD2SH39aJixoXN9ZaNwRlcftJe9WbtPNDC9q5V9WX7Z5jCwkAwehcI\" }, \"challenge\": \"9pIcUwwrY5eD9o3OwfhkeHLnoIl0vaeJUbxSHMe_XgE\", \"username\":\"ryan\", \"policy\": { \"accepted\": [ [ { \"aaid\": [ \"0001#8001\" ] } ], [ { \"aaid\": [ \"53EC#3101\" ] } ] ] } } ]";
-static char *json_auth = "[ { \"header\": { \"upv\": { \"major\": 1, \"minor\": 0 }, \"op\": \"Auth\", \"serverData\": \"emKubKMS8RxYOth7J8enT_x7dQWBaO1CiC0fGmSEhX56kq2RYo1LRpwvfHlzYRI3p9Ay-l4zJcV3lX6rQ0CYNWi5nNDabClFm3k0pPj0kX5V-db9ejN_05y2J6wqztSD\" }, \"challenge\": \"1AM2yZY4-9SG4Ns7-hMdB8IV_FTDKFFiUqNJNVbsVoo\", \"transaction\": [ { \"contentType\": \"text/plain\", \"content\": \"VHJhbnNhY3Rpb24gQ29udGVudCBmb3IgVGVzdC4\", \"tcDisplayPNGCharacteristics\": [ { \"width\": 320, \"height\": 240, \"bitDepth\": 16, \"colorType\": 2, \"compression\": 0, \"filter\": 0, \"interlace\": 0 } ] } ], \"policy\": { \"accepted\": [ [ { \"aaid\": [ \"0001#8001\" ] } ], [ { \"aaid\": [ \"53EC#3101\" ] } ] ] } } ]";
+static char *json_reg = "[ { \"header\": { \"upv\": { \"major\": 1, \"minor\": 0 },\"op\":\"Reg\", \"serverData\": \"nwV8EPqS5raZdAgH3GD9Z-ytCA9MkiiWaCsr1GHHNJ2yUh3HaV1HHxd4Z67FefJOD5sQYZvipfg5BavhdWPMecD2SH39aJixoXN9ZaNwRlcftJe9WbtPNDC9q5V9WX7Z5jCwkAwehcI\" }, \"challenge\": \"9pIcUwwrY5eD9o3OwfhkeHLnoIl0vaeJUbxSHMe_XgE\", \"username\":\"ryan\", \"policy\": { \"accepted\": [ [ { \"aaid\": [ \"0001#8001\" ] } ], [ { \"aaid\": [ \"DDDD#F001\" ] } ] ] } } ]";
+static char *json_auth = "[ { \"header\": { \"upv\": { \"major\": 1, \"minor\": 0 }, \"op\": \"Auth\", \"serverData\": \"emKubKMS8RxYOth7J8enT_x7dQWBaO1CiC0fGmSEhX56kq2RYo1LRpwvfHlzYRI3p9Ay-l4zJcV3lX6rQ0CYNWi5nNDabClFm3k0pPj0kX5V-db9ejN_05y2J6wqztSD\" }, \"challenge\": \"1AM2yZY4-9SG4Ns7-hMdB8IV_FTDKFFiUqNJNVbsVoo\", \"transaction\": [ { \"contentType\": \"text/plain\", \"content\": \"VHJhbnNhY3Rpb24gQ29udGVudCBmb3IgVGVzdC4\", \"tcDisplayPNGCharacteristics\": [ { \"width\": 320, \"height\": 240, \"bitDepth\": 16, \"colorType\": 2, \"compression\": 0, \"filter\": 0, \"interlace\": 0 } ] } ], \"policy\": { \"accepted\": [ [ { \"aaid\": [ \"0001#8001\" ] } ], [ { \"aaid\": [ \"DDDD#F001\" ] } ] ] } } ]";
static char *json_dereg = "[ { \"header\": { \"upv\": { \"major\": \"1\", \"minor\": \"0\" }, \"op\": \"Dereg\" }, \"authenticators\": [ { \"aaid\": \"0001#8001\", \"keyID\": \"uWrbo_8JI1HmPESrNAStTVV8ZbBrzLsf_kZu1QKX2YY\" } ] } ]";
void get_user_choice(void);