From 8575b306e73eea666f79bf3fac4228555a9f7bc5 Mon Sep 17 00:00:00 2001 From: Manasij Sur Roy Date: Wed, 20 Jan 2016 12:27:39 +0530 Subject: [PATCH] Added DisplayPNGCharacteristicsDescriptor for Registration Assertion Change-Id: I554d59fe39a62cb7f12c68f1ec6be08d60ba54db Signed-off-by: Manasij Sur Roy --- common/fido_internal_types.h | 14 +++++---- common/fido_json_handler.c | 61 +++++++++++++++++++++++++++++++++++++++ server/fido_server.c | 4 +++ server/fido_uaf_policy_checker.c | 62 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 6 deletions(-) diff --git a/common/fido_internal_types.h b/common/fido_internal_types.h index 90dac32..e6f290e 100644 --- a/common/fido_internal_types.h +++ b/common/fido_internal_types.h @@ -167,9 +167,10 @@ typedef struct _message { void _free_message(_message_t *data); typedef struct _reg_request { - char *challenge; - char *user_name; - _policy_t *policy; + char *challenge; + char *user_name; + _policy_t *policy; + GList *png_list;/*ASM does not send it in reg resp, but client needs to send it back for reg resp*/ } _reg_request_t; void _free_reg_request(_reg_request_t *data); @@ -324,9 +325,9 @@ typedef struct _ui_auth_data { void _free_ui_auth_data(_ui_auth_data_t *data); typedef struct _auth_reg_assertion { - char *assertion_schm; - char *assertion; - //GList *tc_disp_char_list; + char *assertion_schm; + char *assertion; + GList *tc_disp_char_list;/*fido_display_png_characteristics_descriptor_s list*/ //GList *ext_list; } _auth_reg_assertion_t; @@ -369,6 +370,7 @@ typedef struct _matched_auth_data { int att_type; char *label; GList *key_ids; + GList *tc_display_png_characteristics; } _matched_auth_data_t; void _free_matched_auth_data(gpointer data); diff --git a/common/fido_json_handler.c b/common/fido_json_handler.c index dfedb05..2b41500 100644 --- a/common/fido_json_handler.c +++ b/common/fido_json_handler.c @@ -1396,6 +1396,67 @@ _uaf_composer_compose_uaf_process_response_reg(_op_header_t *header, char *final 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); + + 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) { + + 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); + + + if (png_data->plte != NULL) { + /*plte array start*/ + + 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) { + + 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); + + json_builder_end_object(builder); + } + + plte_iter = plte_iter->next; + } + + json_builder_end_array(builder); + + /*plte array end*/ + } + + json_builder_end_object(builder); + } + + iter = iter->next; + } + + json_builder_end_array(builder); + } + json_builder_end_object(builder); assertions_iter = assertions_iter->next; diff --git a/server/fido_server.c b/server/fido_server.c index 297e3e6..ddc973d 100755 --- a/server/fido_server.c +++ b/server/fido_server.c @@ -378,6 +378,7 @@ _asm_response_reg_process(int error_code, const char *asm_response_json, void *u _fido_asm_reg_in_t *asm_reg_in = (_fido_asm_reg_in_t *)(cb_data->asm_in); _message_t *uaf_req = cb_data->uaf_req; + _reg_request_t *uaf_reg_req = (_reg_request_t*)(uaf_req->data); _op_header_t *header = uaf_req->header; char *uaf_response_json = NULL; @@ -386,6 +387,7 @@ _asm_response_reg_process(int error_code, const char *asm_response_json, void *u _auth_reg_assertion_t *ass_data = (_auth_reg_assertion_t*) calloc(1, sizeof(_auth_reg_assertion_t)); ass_data->assertion = __dup_string(asm_reg_out->assertion); ass_data->assertion_schm = __dup_string(asm_reg_out->assertion_schm); + ass_data->tc_disp_char_list = uaf_reg_req->png_list; _free_asm_out(asm_out); @@ -417,6 +419,8 @@ __handle_reg(_process_cb_data_t *cb_data, _matched_auth_data_t *matched_auth) _reg_request_t *uaf_reg_req = (_reg_request_t *)(cb_data->uaf_req->data); + uaf_reg_req->png_list = matched_auth->tc_display_png_characteristics; + _fido_asm_reg_in_t *reg_in = (_fido_asm_reg_in_t*) calloc(1, sizeof(_fido_asm_reg_in_t)); /*If no app-id mentioned in UAF request*/ diff --git a/server/fido_uaf_policy_checker.c b/server/fido_uaf_policy_checker.c index b077abe..2d8b4c7 100644 --- a/server/fido_uaf_policy_checker.c +++ b/server/fido_uaf_policy_checker.c @@ -358,6 +358,65 @@ __copy_string_list(GList *src) return dest; } +static GList* +__copy_png_list(GList *src_list) +{ + RET_IF_FAIL(src_list != NULL, NULL); + + GList *dest = NULL; + + /*fido_display_png_characteristics_descriptor_s list*/ + GList *iter = g_list_first(src_list); + + while (iter != NULL) { + fido_display_png_characteristics_descriptor_s *src_data = + (fido_display_png_characteristics_descriptor_s *)(iter->data); + + if (src_data != NULL) { + fido_display_png_characteristics_descriptor_s *dest_data = + calloc(1, sizeof(fido_display_png_characteristics_descriptor_s)); + + dest_data->bit_depth = src_data->bit_depth; + dest_data->color_type = src_data->color_type; + dest_data->compression = src_data->compression; + dest_data->filter = src_data->filter; + dest_data->height = src_data->height; + dest_data->interlace = src_data->interlace; + dest_data->width = src_data->width; + /*TODO: dest_data->plte clone*/ + if (src_data->plte != NULL) { + GList *p_iter = g_list_first(src_data->plte); + while (p_iter != NULL) { + + fido_rgb_pallette_entry_s *plte_src_data = (fido_rgb_pallette_entry_s*)(p_iter->data); + if (plte_src_data != NULL) { + fido_rgb_pallette_entry_s *plte_dest_data = calloc(1, sizeof(fido_rgb_pallette_entry_s)); + plte_dest_data->r = plte_src_data->r; + plte_dest_data->g = plte_src_data->g; + plte_dest_data->b = plte_src_data->b; + + dest_data->plte = g_list_append(dest_data->plte, plte_dest_data); + } + p_iter = p_iter->next; + } + } + + if (dest_data->plte != NULL) + dest_data->plte = g_list_first(dest_data->plte); + + dest_data->plte = + dest = g_list_append(dest, dest_data); + } + + iter = iter->next; + } + + if (dest != NULL) + dest = g_list_first(dest); + + return dest; +} + /* Returns _matched_auth_data_t list*/ GList * _policy_checker_get_matched_auth_list(_policy_t *policy, GList *auth_list) @@ -435,6 +494,9 @@ _policy_checker_get_matched_auth_list(_policy_t *policy, GList *auth_list) _ERR("Authenticator does not have any ASM ID!!"); matched_auth_data->key_ids = __copy_string_list(match_info->key_id_list); + /*fido_display_png_characteristics_descriptor_s list*/ + matched_auth_data->tc_display_png_characteristics = + __copy_png_list(authenticator->tc_display_png_characteristics); allowed_list = g_list_append(allowed_list, matched_auth_data); } -- 2.7.4