00001 #include "asm_message_parser.h"
00002 #include "../include/xml_helper.h"
00003 #ifndef _WIN32
00004 #include "config.h"
00005 #else
00006 #include "../winconfig.h"
00007 #endif
00008 #ifdef MC_SECURITY
00009
00010 error_code_t
00011 asm_message_parse(asm_node_p asm_node)
00012 {
00013 xml_parser_t xml_parser;
00014 xml_parser.root = asm_node->xml_encrypt_root;
00015 xml_parser.node = asm_node->xml_encrypt_root;
00016 return asm_message_parse__encryption_data(asm_node, &xml_parser);
00017 }
00018
00019 error_code_t
00020 asm_message_parse__encryption_data
00021 (
00022 asm_node_p asm_node,
00023 xml_parser_p xml_parser
00024 )
00025 {
00026 int ret;
00027 const mxml_node_t *encryption_data_node;
00028 const char* attribute;
00029
00030 if (
00031 strcmp(
00032 (const char*)xml_get_element_name((const mxml_node_t*)xml_parser->node),
00033 "ENCRYPTION_DATA"
00034 )
00035 )
00036 {
00037 return MC_ERR_PARSE;
00038 }
00039 encryption_data_node = xml_parser->node;
00040
00041 attribute = mxmlElementGetAttr
00042 (
00043 (mxml_node_t*)xml_parser->node,
00044 "protocol"
00045 );
00046 if (!strcmp(attribute, "diffie-hellman")) {
00047 xml_parser->node = xml_get_child
00048 (
00049 encryption_data_node,
00050 "P",
00051 1
00052 );
00053 ret = asm_message_parse__p(asm_node, xml_parser);
00054 if (ret)
00055 return ret;
00056 xml_parser->node = xml_get_child
00057 (
00058 encryption_data_node,
00059 "G",
00060 1
00061 );
00062 ret = asm_message_parse__g(asm_node, xml_parser);
00063 if(ret)
00064 return ret;
00065 xml_parser->node = xml_get_child
00066 (
00067 encryption_data_node,
00068 "Y",
00069 1
00070 );
00071 ret = asm_message_parse__y(asm_node, xml_parser);
00072 if(ret) return ret;
00073 } else {
00074
00075 return MC_ERR_PARSE;
00076 }
00077 return MC_SUCCESS;
00078 }
00079
00080 error_code_t
00081 asm_message_parse__p(asm_node_p asm_node, xml_parser_p xml_parser)
00082 {
00083 char* P;
00084 error_code_t ret = MC_SUCCESS;
00085 if (xml_parser->node == NULL) {
00086 return MC_ERR_PARSE;
00087 }
00088 P = xml_get_text(xml_parser->node);
00089 if (P != NULL) {
00090 if (mpi_read_string(&(asm_node->data.dh_data->dhm.P), 16, P)) {
00091 fprintf(stderr, "Parse error. %s:%d\n", __FILE__, __LINE__);
00092 ret = MC_ERR_PARSE;
00093 }
00094 goto cleanup;
00095 } else {
00096 ret = MC_ERR_PARSE;
00097 return ret;
00098 }
00099
00100 cleanup:
00101 if(P!=NULL)
00102 free(P);
00103 return ret;
00104 }
00105
00106 error_code_t
00107 asm_message_parse__g(asm_node_p asm_node, xml_parser_p xml_parser)
00108 {
00109 char* G;
00110 error_code_t ret = MC_SUCCESS;
00111 if (xml_parser->node == NULL) {
00112 return MC_ERR_PARSE;
00113 }
00114 G = xml_get_text(xml_parser->node);
00115 if (G == NULL) { ret = MC_ERR_PARSE; goto cleanup; }
00116
00117 if(mpi_read_string(&(asm_node->data.dh_data->dhm.G), 16, G)) {
00118 fprintf(stderr, "Parse error. %s:%d\n", __FILE__, __LINE__);
00119 ret = MC_ERR_PARSE;
00120 }
00121
00122 cleanup:
00123 if(G!=NULL)
00124 free(G);
00125 return ret;
00126 }
00127
00128 error_code_t
00129 asm_message_parse__y(asm_node_p asm_node, xml_parser_p xml_parser)
00130 {
00131 char* Y;
00132 error_code_t ret = MC_SUCCESS;
00133 if (xml_parser->node == NULL) {
00134 return MC_ERR_PARSE;
00135 }
00136 Y = xml_get_text(xml_parser->node);
00137 if(Y == NULL) {ret = MC_ERR_PARSE; goto cleanup;}
00138 if(mpi_read_string(&(asm_node->data.dh_data->dhm.GY), 16, Y)) {
00139 fprintf(stderr, "Parse error. %s:%d\n", __FILE__, __LINE__);
00140 ret = MC_ERR_PARSE;
00141 }
00142
00143 cleanup:
00144 if(Y!=NULL)
00145 free(Y);
00146 return ret;
00147 }
00148 #endif