Quellcode durchsuchen

improved the tests for base64, the calculate method now returns the exact size of the encoded data

Stasik0 vor 10 Jahren
Ursprung
Commit
4f9e729edd
3 geänderte Dateien mit 79 neuen und 9 gelöschten Zeilen
  1. 2 2
      include/ua_base64.h
  2. 11 2
      src/util/ua_base64.c
  3. 66 5
      tests/check_base64.c

+ 2 - 2
include/ua_base64.h

@@ -10,8 +10,8 @@
 
 #include "ua_basictypes.h"
 
-/** @brief calculates the upper bound for the binary data that is encoded in base64 encoded string */
-UA_Int32 UA_base64_getDecodedSizeUB(UA_String* const base64EncodedData);
+/** @brief calculates the exact size for the binary data that is encoded in base64 encoded string */
+UA_Int32 UA_base64_getDecodedSize(UA_String* const base64EncodedData);
 
 /** @brief decodes base64 encoded string into target, target should be at least of the size returned by UA_base64_getDecodedSizeUB */
 UA_Int32 UA_base64_decode(UA_String* const base64EncodedData, UA_Byte* target);

+ 11 - 2
src/util/ua_base64.c

@@ -36,12 +36,21 @@ end library headers
 
 #include "ua_base64.h"
 
-UA_Int32 UA_base64_getDecodedSizeUB(UA_String* const base64EncodedData){
+UA_Int32 UA_base64_getDecodedSize(UA_String* const base64EncodedData){
 	//note that base64-encoded data length is always divisible by 4
-	return base64EncodedData->length * 3 / 4;
+	UA_Int32 temp = base64EncodedData->length * 3 / 4;
+
+	//subtract padding
+	if(base64EncodedData->data[base64EncodedData->length-1] == '=') temp--;
+	if(base64EncodedData->data[base64EncodedData->length-2] == '=') temp--;
+
+	return temp;
 }
 
 UA_Int32 UA_base64_decode(UA_String* const base64EncodedData, UA_Byte* target){
+	if(target == UA_NULL){
+		return UA_ERROR;
+	}
 	base64_decodestate state;
 	base64_init_decodestate(&state);
 	//FIXME: The (void*)(char*) was was perfomed to get rid of "differ in signedness" warnings. Can be a potential problem since the library code expects 'char' but we have 'unsigned char' in UA_String

+ 66 - 5
tests/check_base64.c

@@ -4,17 +4,76 @@
 #include "check.h"
 
 
-START_TEST(base64_test_basic)
+START_TEST(base64_test_2padding)
 {
 
+	//this is base64'd ASCII string "open62541!"
+	UA_String encodedString = {16, (UA_Byte*)"b3BlbjYyNTQxIQ=="};
+
+	//assure that we allocate exactly 10 bytes
+	ck_assert_int_eq(UA_base64_getDecodedSize(&encodedString), 10);
+
+	UA_Byte* decodedData = (UA_Byte*)malloc(UA_base64_getDecodedSize(&encodedString));
+
+	UA_base64_decode(&encodedString, decodedData);
+
+	//check the string
+	ck_assert_int_eq(decodedData[0], 'o');
+	ck_assert_int_eq(decodedData[1], 'p');
+	ck_assert_int_eq(decodedData[2], 'e');
+	ck_assert_int_eq(decodedData[3], 'n');
+	ck_assert_int_eq(decodedData[4], '6');
+	ck_assert_int_eq(decodedData[5], '2');
+	ck_assert_int_eq(decodedData[6], '5');
+	ck_assert_int_eq(decodedData[7], '4');
+	ck_assert_int_eq(decodedData[8], '1');
+	ck_assert_int_eq(decodedData[9], '!');
+
+	free(decodedData);
+}
+END_TEST
+
+START_TEST(base64_test_1padding)
+{
+
+	//this is base64'd ASCII string "open62541!!"
+	UA_String encodedString = {16, (UA_Byte*)"b3BlbjYyNTQxISE="};
+
+	//assure that we allocate exactly 11 bytes
+	ck_assert_int_eq(UA_base64_getDecodedSize(&encodedString), 11);
+
+	UA_Byte* decodedData = (UA_Byte*)malloc(UA_base64_getDecodedSize(&encodedString));
+
+	UA_base64_decode(&encodedString, decodedData);
+
+	//check the string
+	ck_assert_int_eq(decodedData[0], 'o');
+	ck_assert_int_eq(decodedData[1], 'p');
+	ck_assert_int_eq(decodedData[2], 'e');
+	ck_assert_int_eq(decodedData[3], 'n');
+	ck_assert_int_eq(decodedData[4], '6');
+	ck_assert_int_eq(decodedData[5], '2');
+	ck_assert_int_eq(decodedData[6], '5');
+	ck_assert_int_eq(decodedData[7], '4');
+	ck_assert_int_eq(decodedData[8], '1');
+	ck_assert_int_eq(decodedData[9], '!');
+	ck_assert_int_eq(decodedData[10], '!');
+
+	free(decodedData);
+}
+END_TEST
+
+START_TEST(base64_test_0padding)
+{
 
 	//this is base64'd ASCII string "open62541"
 	UA_String encodedString = {12, (UA_Byte*)"b3BlbjYyNTQx"};
 
-	//assure that we allocate at least 9 bytes
-	ck_assert_int_ge(UA_base64_getDecodedSizeUB(&encodedString), 9);
+	//assure that we allocate exactly 9 bytes
+	ck_assert_int_eq(UA_base64_getDecodedSize(&encodedString), 9);
+
+	UA_Byte* decodedData = (UA_Byte*)malloc(UA_base64_getDecodedSize(&encodedString));
 
-	UA_Byte* decodedData = (UA_Byte*)malloc(UA_base64_getDecodedSizeUB(&encodedString));
 	UA_base64_decode(&encodedString, decodedData);
 
 	//check the string
@@ -36,7 +95,9 @@ Suite*base64_testSuite(void)
 {
 	Suite *s = suite_create("base64_test");
 	TCase *tc_core = tcase_create("Core");
-	tcase_add_test(tc_core, base64_test_basic);
+	tcase_add_test(tc_core, base64_test_2padding);
+	tcase_add_test(tc_core, base64_test_1padding);
+	tcase_add_test(tc_core, base64_test_0padding);
 	suite_add_tcase(s,tc_core);
 	return s;
 }