/home/dko/projects/mobilec/trunk/src/security/asm_message_parser.c

Go to the documentation of this file.
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   /* Make sure this is the 'ENCRYPTION_DATA' element */
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     /* Other protocols not yet supported. */
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 /*MC_SECURITY*/

Generated on Fri May 16 14:49:55 2008 for Mobile-C by  doxygen 1.5.4