Add corner cases for CounterSign
This should increase coverage
diff --git a/src/CounterSign.c b/src/CounterSign.c
index 7047aa0..14c9a02 100644
--- a/src/CounterSign.c
+++ b/src/CounterSign.c
@@ -25,8 +25,6 @@
return true;
}
- _COSE_RemoveFromList(&CountersignRoot, &pSigner->m_signer.m_message);
-
_COSE_SignerInfo_Release(&pSigner->m_signer);
COSE_FREE(pSigner, &pSigner->m_signer.m_message.m_allocContext);
@@ -54,7 +52,11 @@
CHECK_CONDITION(cbor->type == CN_CBOR_ARRAY, COSE_ERR_INVALID_PARAMETER);
if (!_COSE_SignerInfo_Init_From_Object(
cbor, &pobj->m_signer, CBOR_CONTEXT_PARAM_COMMA perr)) {
- goto errorReturn;
+ _COSE_SignerInfo_Release(&pobj->m_signer);
+ if (pIn == NULL) {
+ COSE_FREE(pobj, context);
+ }
+ return NULL;
}
if (pIn == NULL) {
@@ -112,6 +114,8 @@
return true;
}
+ _COSE_RemoveFromList(&CountersignRoot, &p->m_signer.m_message);
+
fRet = _COSE_CounterSign_Free(p);
errorReturn:
@@ -127,8 +131,7 @@
COSE_CounterSign* pSigner = (COSE_CounterSign*)hSigner;
CHECK_CONDITION(IsValidCounterSignHandle(hSigner), COSE_ERR_INVALID_HANDLE);
- CHECK_CONDITION(pSigner->m_signer.m_message.m_counterSigners == NULL,
- COSE_ERR_INVALID_PARAMETER);
+ CHECK_CONDITION(pSigner->m_next == NULL, COSE_ERR_INVALID_PARAMETER);
pSigner->m_next = pMessage->m_counterSigners;
pMessage->m_counterSigners = pSigner;
diff --git a/src/SignerInfo.c b/src/SignerInfo.c
index 8d117c5..0fd4204 100644
--- a/src/SignerInfo.c
+++ b/src/SignerInfo.c
@@ -123,11 +123,9 @@
return pSigner;
errorReturn:
- if (pSigner != NULL) {
+ if (pSigner != NULL && pIn == NULL) {
_COSE_SignerInfo_Release(pSigner);
- if (pIn == NULL) {
- COSE_FREE(pSigner, context);
- }
+ COSE_FREE(pSigner, context);
}
return NULL;
}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 58b5ceb..18dd494 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,6 +1,6 @@
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dist_dir}/test)
-add_executable(cose_test test.c json.c encrypt.c sign.c context.c mac_test.c)
+add_executable(cose_test test.c json.c encrypt.c sign.c context.c mac_test.c CounterSign_test.c)
target_link_libraries(cose_test PRIVATE cose-c::cose-c cn-cbor::cn-cbor)
@@ -176,3 +176,10 @@
NAME Memory-sign-eddsa
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND cose_test --memory Examples/eddsa-examples/eddsa-01.json)
+
+if(COSE_C_INCLUDE_COUNTERSIGN)
+ add_test(
+ NAME Memory-Countersign
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ COMMAND cose_test --memory Examples/countersign/mac0-01.json)
+endif()
diff --git a/test/CounterSign_test.c b/test/CounterSign_test.c
new file mode 100644
index 0000000..3b9d53a
--- /dev/null
+++ b/test/CounterSign_test.c
@@ -0,0 +1,87 @@
+// encrypt.c
+
+#define _CRT_SECURE_NO_WARNINGS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <cose/cose.h>
+#include <cose/cose_configure.h>
+#include <cn-cbor/cn-cbor.h>
+
+#include "test.h"
+#include "cose_int.h"
+
+void CounterSign_Corners()
+{
+ HCOSE_COUNTERSIGN hCounterSign = NULL;
+ HCOSE_COUNTERSIGN hBadHandle = NULL;
+ HCOSE_COUNTERSIGN hNULL = NULL;
+ cose_errback cose_error;
+ byte rgb[10];
+
+ cn_cbor *cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+
+ hCounterSign = COSE_CounterSign_Init(CBOR_CONTEXT_PARAM_COMMA NULL);
+ hBadHandle = (HCOSE_COUNTERSIGN)COSE_CALLOC(1, sizeof(COSE), context);
+ HCOSE_SIGN1 hSign1 =
+ COSE_Sign1_Init(0, CBOR_CONTEXT_PARAM_COMMA & cose_error);
+
+ // Look for invalid parameter
+ // Null handle checks
+ // bad handle checks
+ // null pointers
+
+ CHECK_FAILURE(
+ COSE_CounterSign_map_get_int(hNULL, 1, COSE_BOTH, &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ CHECK_FAILURE(
+ COSE_CounterSign_map_get_int(hNULL, 1, COSE_BOTH, &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ CHECK_FAILURE(
+ COSE_CounterSign_map_get_int(hCounterSign, 1, COSE_BOTH, &cose_error),
+ COSE_ERR_INVALID_PARAMETER, CFails++);
+
+ CHECK_FAILURE(COSE_CounterSign_map_put_int(
+ hNULL, 1, cn, COSE_PROTECT_ONLY, &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ CHECK_FAILURE(COSE_CounterSign_map_put_int(
+ hNULL, 1, cn, COSE_PROTECT_ONLY, &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ CHECK_FAILURE(COSE_CounterSign_map_put_int(
+ hNULL, 1, NULL, COSE_PROTECT_ONLY, &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ CHECK_FAILURE(COSE_CounterSign_map_put_int(hCounterSign, 1, cn,
+ COSE_PROTECT_ONLY | COSE_UNPROTECT_ONLY, &cose_error),
+ COSE_ERR_INVALID_PARAMETER, CFails++);
+
+ CHECK_FAILURE(COSE_Sign1_add_countersignature(hSign1, hBadHandle, &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ ((COSE_CounterSign *)hCounterSign)->m_next = (COSE_CounterSign *)hBadHandle;
+ CHECK_FAILURE(
+ COSE_Sign1_add_countersignature(hSign1, hCounterSign, &cose_error),
+ COSE_ERR_INVALID_PARAMETER, CFails++);
+ CHECK_FAILURE(COSE_Sign1_get_countersignature(hSign1, 3, &cose_error),
+ COSE_ERR_INVALID_PARAMETER, CFails++);
+ ((COSE_CounterSign *)hCounterSign)->m_next = NULL;
+ COSE_Sign1_add_countersignature(hSign1, hCounterSign, &cose_error);
+ CHECK_FAILURE(COSE_Sign1_get_countersignature(hSign1, 3, &cose_error),
+ COSE_ERR_INVALID_PARAMETER, CFails++);
+
+ CHECK_FAILURE(
+ COSE_CounterSign_SetExternal(hNULL, rgb, sizeof(rgb), &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ CHECK_FAILURE(
+ COSE_CounterSign_SetExternal(hBadHandle, rgb, sizeof(rgb), &cose_error),
+ COSE_ERR_INVALID_HANDLE, CFails++);
+ COSE_CounterSign_SetExternal(hCounterSign, rgb, sizeof(rgb), &cose_error);
+
+
+ CHECK_RETURN(!COSE_CounterSign_Free(hBadHandle), false, CFails++);
+
+ COSE_CounterSign_Free(hCounterSign);
+ COSE_Sign1_Free(hSign1);
+
+
+
+}
diff --git a/test/test.c b/test/test.c
index b943227..1af4a38 100644
--- a/test/test.c
+++ b/test/test.c
@@ -865,6 +865,9 @@
#if INCLUDE_ENCRYPT || INCLUDE_MAC
Recipient_Corners();
#endif
+#if INCLUDE_COUNTERSIGNATURE
+ CounterSign_Corners();
+#endif
}
void RunMemoryTest(const char* szFileName)
@@ -906,6 +909,12 @@
if (IsContextEmpty(context) != 0) {
CFails += 1;
}
+#ifndef NDEBUG
+ if (!AreListsEmpty()) {
+ CFails += 1;
+ break;
+ }
+#endif
FreeContext(context);
}
@@ -919,6 +928,12 @@
if (IsContextEmpty(context) != 0) {
CFails += 1;
}
+#ifndef NDEBUG
+ if (!AreListsEmpty()) {
+ CFails += 1;
+ break;
+ }
+#endif
FreeContext(context);
}
#else
diff --git a/test/test.h b/test/test.h
index 7fefe47..19a402f 100644
--- a/test/test.h
+++ b/test/test.h
@@ -21,6 +21,7 @@
void Enveloped_Corners();
void Encrypt_Corners();
void Recipient_Corners();
+void CounterSign_Corners();
// sign.c