Advertisement
Patasuss

RULE_SER

Apr 2nd, 2017
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.86 KB | None | 0 0
  1. #ifndef SAD_TEST_RULE_SERIALIZATION_H
  2. #define SAD_TEST_RULE_SERIALIZATION_H
  3.  
  4. #include "../rule_representation/rule.h"
  5. #include "../util/sad_stdlib.h"
  6. #include "../util/sad_stdint.h"
  7.  
  8.  
  9.  
  10. //TODO document
  11. typedef struct _sad_rule_serialization_result {
  12. char *data;
  13. unsigned int size;
  14. } sad_rule_serialization_result;
  15.  
  16.  
  17. //TODO fill
  18. //TODO document
  19. typedef struct _sad_rule_deserialization_result {
  20.  
  21. } sad_rule_deserialization_result;
  22.  
  23.  
  24. //TODO document
  25. typedef struct _sad_attribute_collection {
  26. unsigned int numAttributes;
  27. sad_rule_attribute_generic** attributes;
  28. } sad_attribute_collection;
  29.  
  30.  
  31. //TODO document
  32. typedef struct _sad_condition_collection {
  33. unsigned int numConditions;
  34. sad_rule_condition_generic** conditions;
  35. } sad_condition_collection;
  36.  
  37.  
  38. //TODO document
  39. //TODO move to .c file
  40. unsigned int sad_count_attributes(sad_rule* rule) {
  41. int i;
  42. unsigned int numAttributes=0;
  43. sad_rule_condition_allowedmatches* cond;
  44.  
  45. numAttributes += rule->numAttributes;
  46.  
  47. //Count attributes in all sad_rule_condition_allowedmatches structs
  48. for(i=0; i<rule->numConditions; ++i) {
  49. if(rule->conditions[i]->type==ALLOWED_MATCHES) {
  50. cond = (sad_rule_condition_allowedmatches*) rule->conditions[i];
  51. if(cond==0) {
  52. continue;
  53. }
  54. numAttributes+=cond->numAttributes;
  55. }
  56. }
  57.  
  58. return numAttributes;
  59. }
  60.  
  61.  
  62. //TODO document
  63. //TODO move to .c file
  64. int sad_copy_attribute_pointers(sad_rule* rule, _sad_attribute_collection* collection) {
  65. int i, j;
  66. unsigned int attrArrayPointer = 0; /* Indicates where to store next attribute in collection array */
  67. sad_rule_condition_allowedmatches* cond;
  68.  
  69. for(i=0; i<rule->numAttributes; ++i) { /* Copy attribute pointers from rule struct to collection */
  70. if(attrArrayPointer>collection->numAttributes) {
  71. return -1;
  72. }
  73. collection->attributes[attrArrayPointer] = rule->attributes[i];
  74. attrArrayPointer++;
  75. }
  76.  
  77. for(i=0; i<rule->numConditions; ++i) {
  78. if(rule->conditions[i]->type==ALLOWED_MATCHES) {
  79. cond = (sad_rule_condition_allowedmatches*) rule->conditions[i];
  80. if(cond==0) {
  81. continue;
  82. }
  83. for(j=0; j<cond->numAttributes; ++j) { /* Copy attribute pointers from condition to collection */
  84. if(attrArrayPointer>collection->numAttributes) {
  85. return -1;
  86. }
  87. collection->attributes[attrArrayPointer] = cond->attributes[j];
  88. attrArrayPointer++;
  89. }
  90. }
  91. }
  92.  
  93. return 0;
  94. }
  95.  
  96.  
  97. //TODO document
  98. //TODO move to .c file
  99. int sad_copy_condition_pointers(sad_rule* rule, sad_condition_collection* collection) {
  100. int i;
  101. for(i=0; i<rule->numConditions; ++i) {
  102. collection->conditions[i] = rule->conditions[i];
  103. }
  104.  
  105. return 0;
  106. }
  107.  
  108.  
  109. //TODO document
  110. //TODO move to .c file
  111. int sad_collect_attributes(sad_rule* rule, sad_attribute_collection* collection) {
  112. collection->numAttributes = sad_count_attributes(rule);
  113. collection->attributes = SAD_MALLOC(sizeof(sad_rule_attribute_generic)*collection->numAttributes);
  114. return sad_copy_attribute_pointers(rule, collection);
  115. }
  116.  
  117.  
  118. //TODO document
  119. //TODO move to .c file
  120. int sad_collect_conditions(sad_rule* rule, sad_condition_collection* collection) {
  121. collection->numConditions = rule->numConditions;
  122. collection->conditions = SAD_MALLOC(sizeof(sad_rule_condition_generic)*collection->numConditions);
  123. return sad_copy_condition_pointers(rule, collection);
  124. }
  125.  
  126.  
  127. //TODO document
  128. //TODO move to .c file
  129. unsigned int sad_get_attribute_size(sad_rule_attribute_generic* attr) {
  130. if(attr==0) {
  131. return sizeof(sad_rule_attribute_generic);
  132. }
  133. switch (attr->type) {
  134. case HASH:
  135. case PARENT_HASH:
  136. return sizeof(sad_rule_attribute_hash);
  137. case NAME:
  138. return sizeof(sad_rule_attribute_name);
  139. case VENDOR:
  140. return sizeof(sad_rule_attribute_vendor);
  141. case SERIAL:
  142. return sizeof(sad_rule_attribute_serial);
  143. case VIAPORT:
  144. return sizeof(sad_rule_attribute_viaport);
  145. case WITHINTERFACE:
  146. return sizeof(sad_rule_attribute_withinterface);
  147. default:
  148. return sizeof(sad_rule_attribute_generic);
  149. }
  150. }
  151.  
  152.  
  153. //TODO implement
  154. //TODO document
  155. //TODO move to .c file
  156. unsigned int sad_get_condition_size(sad_rule_condition_generic* cond) {
  157. if(cond==0) {
  158. return sizeof(sad_rule_condition_generic);
  159. }
  160. switch (cond->type) {
  161. case LOCALTIME:
  162. return sizeof(sad_rule_condition_localtime);
  163. case ALLOWED_MATCHES:
  164. return sizeof(sad_rule_condition_allowedmatches);
  165. case RULE_APPLIED:
  166. case RULE_APPLIED_TIME:
  167. case RULE_EVALUATED:
  168. case RULE_EVALUATED_TIME:
  169. return sizeof(sad_rule_condition_applied);
  170. case TRUE:
  171. case FALSE:
  172. return sizeof(sad_rule_condition_bool);
  173. default:
  174. return sizeof(sad_rule_condition_generic);
  175. }
  176. }
  177.  
  178.  
  179. //TODO document
  180. //TODO move to .c file
  181. unsigned int sad_get_size_of_attributes(unsigned int numAttributes, sad_rule_attribute_generic* attributes) {
  182. unsigned int totalSize=0;
  183. int i;
  184. for(i=0; i<numAttributes; ++i) {
  185. totalSize += sad_get_attribute_size(attributes[i]);
  186. }
  187. return totalSize;
  188. }
  189.  
  190.  
  191. //TODO document
  192. //TODO move to .c file
  193. unsigned int sad_get_size_of_conditions(unsigned int numConditions, sad_rule_condition_generic* conditions) {
  194. unsigned int totalSize=0;
  195. int i;
  196. for(i=0; i<numConditions; ++i) {
  197. totalSize += sad_get_condition_size(conditions[i]);
  198. }
  199. return totalSize;
  200. }
  201.  
  202. //TODO document
  203. //TODO move to .c file
  204. unsigned int sad_get_amount_attr_collections(sad_rule* rule) {
  205. int i;
  206. unsigned int numAttrCollections=1; /* 1 for the sad_rule_struct attributes */
  207.  
  208. for(i=0; i<rule->numConditions; ++i) {
  209. if(rule->conditions[i]->type==ALLOWED_MATCHES) {
  210. numAttrCollections++;
  211. }
  212. }
  213.  
  214. return numAttrCollections;
  215. }
  216.  
  217. //TODO document
  218. //TODO move to .c file
  219. unsigned int sad_get_amount_cond_collections(sad_rule* rule) {
  220. int i;
  221. unsigned int numCondCollections=0;
  222.  
  223. for(i=0; i<rule->numConditions; ++i) {
  224. if(rule->conditions[i]->type==ALLOWED_MATCHES) {
  225. numCondCollections++;
  226. }
  227. }
  228.  
  229. return numCondCollections;
  230. }
  231.  
  232. //TODO document
  233. //TODO move to .c file
  234. int sad_lookup_attr_index(sad_attribute_collection* coll, sad_rule_attribute_generic* attr) {
  235. int i;
  236. sad_rule_attribute_generic* currAttr;
  237. for(i=0; i<coll->numAttributes; ++i) {
  238. currAttr = coll->attributes[i];
  239. if(currAttr == attr) {
  240. return i;
  241. }
  242. }
  243.  
  244. return -1;
  245. }
  246.  
  247. //TODO document
  248. //TODO move to .c file
  249. int sad_lookup_cond_index(sad_condition_collection* coll, sad_rule_condition_generic* cond) {
  250. int i;
  251. sad_rule_condition_generic* currCond;
  252. for(i=0; i<coll->numConditions; ++i) {
  253. currCond = coll->conditions[i];
  254. if(currCond == cond) {
  255. return i;
  256. }
  257. }
  258.  
  259. return -1;
  260. }
  261.  
  262. //TODO implement
  263. //TODO document
  264. //TODO move to .c file
  265. void sad_make_attr_reference_collections(sad_rule* rule, sad_attribute_collection* srcCollection, sad_attribute_collection* destCollections) {
  266. int i;
  267. int j;
  268. int attrIndex;
  269. int collIndex=0;
  270. sad_rule_condition_allowedmatches* cond;
  271. sad_attribute_collection* coll = destCollections;
  272.  
  273. coll[collIndex].numAttributes = (uint8_t)rule->numAttributes;
  274. coll[collIndex].attributes = SAD_MALLOC(sizeof(sad_rule_attribute_generic*)*coll[collIndex].numAttributes);
  275. for(i=0; i<rule->numAttributes; ++i) {
  276. attrIndex = sad_lookup_attr_index(srcCollection, rule->attributes[i]);
  277. coll[collIndex].attributes[i] = (sad_rule_attribute_generic*)((void*)index);
  278. }
  279.  
  280. for(i=0; i<rule->numConditions; ++i) {
  281. if(rule->conditions[i]->type==ALLOWED_MATCHES) {
  282. collIndex++;
  283. cond = (sad_rule_condition_allowedmatches*)rule->conditions[i];
  284. coll[collIndex].numAttributes = cond->numAttributes;
  285. coll[collIndex].attributes = SAD_MALLOC(sizeof(sad_rule_attribute_generic*)*coll[collIndex].numAttributes);
  286. for(j=0; j<cond->numAttributes; ++j) {
  287. attrIndex = sad_lookup_attr_index(srcCollection, cond->attributes[j]);
  288. coll[collIndex].attributes[j] = (sad_rule_attribute_generic*)((void*)index);
  289. }
  290. }
  291. }
  292. }
  293.  
  294. //TODO implement
  295. //TODO document
  296. //TODO move to .c file
  297. void sad_make_cond_reference_collections(sad_rule* rule, sad_condition_collection* srcCollection, sad_attribute_collection* destCollections) {
  298. int i=0;
  299. sad_condition_collection* coll;
  300.  
  301. coll[]
  302. }
  303.  
  304. //TODO implement
  305. //TODO document
  306. //TODO move to .c file
  307. sad_rule_serialization_result sad_serialize_rule(sad_rule* rule) {
  308. sad_rule_serialization_result serialized;
  309. sad_rule ruleCopy;
  310. sad_attribute_collection ruleAttrColl;
  311. sad_condition_collection ruleCondColl;
  312.  
  313. /* temp variables */
  314. /* may resemble the serialized packet */
  315. unsigned int packetSize;
  316. unsigned int attrCollectionSize;
  317. unsigned int condCollectionSize;
  318. sad_attribute_collection attrColl;
  319. sad_condition_collection condColl;
  320. unsigned int numAttributeCollections;
  321. sad_attribute_collection* attributeCollections;
  322. unsigned int numConditionCollections;
  323. sad_condition_collection* conditionCollections;
  324.  
  325. serialized.data = 0;
  326. serialized.size = 0;
  327.  
  328. ruleCopy = *rule;
  329.  
  330. /* Fill packet fields */
  331. sad_collect_attributes(&ruleCopy, &ruleAttrColl);
  332. sad_collect_conditions(&ruleCopy, &ruleCondColl);
  333. attrCollectionSize = sad_get_size_of_attributes(attrColl.numAttributes, attrColl.attributes);
  334. condCollectionSize = sad_get_size_of_conditions(condColl.numConditions, condColl.conditions);
  335. numAttributeCollections = sad_get_amount_attr_collections(&ruleCopy);
  336. numConditionCollections = sad_get_amount_cond_collections(&ruleCopy);
  337. attributeCollections = SAD_MALLOC(sizeof(sad_attribute_collection)*numAttributeCollections);
  338. conditionCollections = SAD_MALLOC(sizeof(sad_condition_collection)*numConditionCollections);
  339. sad_make_attr_reference_collections(&ruleCopy, attrColl, attributeCollections);
  340. sad_make_cond_reference_collections(&ruleCopy, condColl, conditionCollections);
  341.  
  342.  
  343. SAD_FREE(attributeCollections);
  344. SAD_FREE(conditionCollections);
  345. }
  346.  
  347. //Should this just use sad_rule as a return type?
  348. sad_rule_deserialization_result sad_deserialize_rule(sad_rule_serialization_result serialized) {
  349. //TODO implement
  350. }
  351.  
  352. #endif //SAD_TEST_RULE_SERIALIZATION_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement