mirror of
https://github.com/Valeh2012/PersonalVotingMachine
synced 2024-11-01 01:01:00 +02:00
142 lines
4.4 KiB
C++
142 lines
4.4 KiB
C++
#ifndef MAIN_INCLUDE_CONVERTER_H_
|
|
#define MAIN_INCLUDE_CONVERTER_H_
|
|
|
|
/**
|
|
* @file converter.h
|
|
* @brief converter namespace - collection of frequently used conversion/encoding/decoding functions
|
|
*
|
|
* */
|
|
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include "expat.h"
|
|
|
|
/** Buffer size for xml parsing */
|
|
#define output_size 10240
|
|
|
|
/**
|
|
* \namespace converter
|
|
* */
|
|
namespace converter{
|
|
|
|
/** @brief a helper function to convert pem files to der.
|
|
*
|
|
* source: https://github.com/ARMmbed/mbedtls/blob/master/programs/util/pem2der.c
|
|
*
|
|
* @param input pem file buffer
|
|
* @param ilen input buffer length
|
|
* @param output buffer to store converted der content
|
|
* @param olen length of data written in output buffer
|
|
*
|
|
* @returns 0 if OK, else -1
|
|
* */
|
|
int convert_pem_to_der( const unsigned char *input, size_t ilen,
|
|
unsigned char *output, size_t *olen );
|
|
|
|
/**
|
|
* @brief a helper function to convert long hex numbers to base b = 2^32
|
|
*
|
|
* In base 2^32, every digit is 32 bit length unsigned integers (uint32_t).
|
|
* Therefore, each consequent 4 bytes in hex converted into one digit in base b.
|
|
* Note: numbers may contain '0x00' in hex representation which is treated as end of string
|
|
* in string functions. Another parameter is required to indicate length of hex representation
|
|
*
|
|
* @param hex input number buffer
|
|
* @param len input buffer length
|
|
*
|
|
* @returns long base-b number
|
|
*/
|
|
uint32_t* hex2u32(unsigned char* hex, size_t len);
|
|
|
|
/**
|
|
* @brief a helper function to convert long base-b number to hex values for DER encoding
|
|
*
|
|
* Inverse of hex2u32 function
|
|
*
|
|
* @param x long base-b number
|
|
* @param length length of input number
|
|
* @param len output buffer length
|
|
*
|
|
* @returns buffer containing number in hex representation
|
|
* */
|
|
unsigned char * nb(uint32_t *x, int length, size_t *olen);
|
|
|
|
/**
|
|
* @brief a helper function convert to first hash, then base64 encode
|
|
*
|
|
* This function wraps to mbed_tls functions. Given input string buffer,
|
|
* it first finds SHA256 hash, then converts the resulting hash into base64.
|
|
*
|
|
* @param input string buffer
|
|
* @param len input buffer length
|
|
*
|
|
* @returns output buffer
|
|
* */
|
|
unsigned char * base64hash(unsigned char* input, size_t len);
|
|
|
|
/** @brief struct used in xml parsing functions
|
|
* */
|
|
typedef struct {
|
|
int depth; /**< depth of recursion*/
|
|
char* output; /**< output buffer (for parsed xml) */
|
|
int output_off; /**< output buffer offset (last written index, i.e length of written data)*/
|
|
const char *last_name; /**< last opened xml tag */
|
|
} xml_data_t;
|
|
|
|
/**
|
|
* @brief a helper function to insert space for indentation
|
|
*
|
|
* This function prints extra whitespaces to output buffer for indentation purposes.
|
|
*
|
|
* @param user_data parsed xml data
|
|
* */
|
|
static void insert_space(xml_data_t *user_data);
|
|
|
|
/**
|
|
* @brief a callback function called at start of new xml node
|
|
*
|
|
* XMLParser traverses through xml nodes and each time it reaches a new node, this callback function is called.
|
|
* Copy tag name and attributes to output buffer
|
|
*
|
|
* @param user_data parsed xml data
|
|
* @param name just opened current xml node tag name
|
|
* @param atts other attributes of current xml node
|
|
* */
|
|
static void XMLCALL start_element(void *userData, const XML_Char *name, const XML_Char **atts);
|
|
|
|
/**
|
|
* @brief a callback function called at the end of new xml node
|
|
*
|
|
* XMLParser traverses through xml nodes and each time it reaches a closing tags of current node, this callback function is called.
|
|
* If current node is leaf node, add closing tags immediately. Otherwise, add whitespace before closing tags.
|
|
*
|
|
* @param user_data parsed xml data
|
|
* @param name to be closed current xml node tag name
|
|
* */
|
|
static void XMLCALL end_element(void *userData, const XML_Char *name);
|
|
|
|
/**
|
|
* @brief a function to define how to parse xml elements
|
|
*
|
|
* In between starting and closing tags, this functions is called by XMLParser.
|
|
* Here, it just copies data buffer to output buffer without adding extra whitespace.
|
|
*
|
|
* @param user_data parsed xml data
|
|
* @param s data in current xml node
|
|
* @param len length of data
|
|
* */
|
|
static void data_handler(void *userData, const XML_Char *s, int len);
|
|
|
|
/**
|
|
* @brief a helper funciton to canonicalize xml data (XMLC14N11).
|
|
*
|
|
* Specifications can be found here: \see https://www.w3.org/TR/xml-c14n11/#Example-SETags
|
|
*
|
|
* @param str xml input buffer
|
|
* @param len input buffer length
|
|
* */
|
|
void xmlc14n11(char* str, size_t len);
|
|
}
|
|
|
|
#endif
|