Do real testing of handles for encryption side
diff --git a/src/Cose.c b/src/Cose.c
index e6c627d..23b40e3 100644
--- a/src/Cose.c
+++ b/src/Cose.c
@@ -374,3 +374,48 @@
return COSE_ERR_CBOR;
}
}
+
+void _COSE_InsertInList(COSE ** root, COSE * newMsg)
+{
+ if (*root == NULL) {
+ *root = newMsg;
+ return;
+ }
+
+ newMsg->m_handleList = *root;
+ *root = newMsg;
+ return;
+}
+
+bool _COSE_IsInList(COSE * root, COSE * thisMsg)
+{
+ COSE * walk;
+
+ if (root == NULL) return false;
+ if (thisMsg == NULL) return false;
+
+ for (walk = root; walk != NULL; walk = walk->m_handleList) {
+ if (walk == thisMsg) return true;
+ }
+ return false;
+}
+
+void _COSE_RemoveFromList(COSE ** root, COSE * thisMsg)
+{
+ COSE * walk;
+
+ if (*root == thisMsg) {
+ *root = thisMsg->m_handleList;
+ thisMsg->m_handleList = NULL;
+ return;
+ }
+
+ for (walk = *root; walk->m_handleList != NULL; walk = walk->m_handleList) {
+ if (walk->m_handleList == thisMsg) {
+ walk->m_handleList = thisMsg->m_handleList;
+ thisMsg->m_handleList = NULL;
+ return;
+ }
+ }
+ return;
+}
diff --git a/src/Encrypt.c b/src/Encrypt.c
index 3e89366..26b0223 100644
--- a/src/Encrypt.c
+++ b/src/Encrypt.c
@@ -10,12 +10,12 @@
byte RgbDontUse[8 * 1024]; // Remove this array when we can compute the size of a cbor serialization without this hack.
+COSE * EnvelopedRoot = NULL;
bool IsValidEnvelopedHandle(HCOSE_ENVELOPED h)
{
COSE_Enveloped * p = (COSE_Enveloped *)h;
- if (p == NULL) return false;
- return true;
+ return _COSE_IsInList(EnvelopedRoot, p);
}
@@ -38,6 +38,8 @@
return NULL;
}
+ _COSE_InsertInList(&EnvelopedRoot, pobj);
+
return (HCOSE_ENVELOPED) pobj;
}
@@ -75,6 +77,8 @@
}
}
+ if (pIn == NULL) _COSE_InsertInList(&EnvelopedRoot, pobj);
+
return(HCOSE_ENVELOPED) pobj;
}
@@ -90,6 +94,8 @@
context = ((COSE_Enveloped *)h)->m_message.m_allocContext;
#endif
+ _COSE_RemoveFromList(&EnvelopedRoot, (COSE_Enveloped *)h);
+
_COSE_Enveloped_Release((COSE_Enveloped *)h);
COSE_FREE((COSE_Enveloped *)h, &context);
diff --git a/src/Encrypt0.c b/src/Encrypt0.c
index 939d2ff..1d5d7a8 100644
--- a/src/Encrypt0.c
+++ b/src/Encrypt0.c
@@ -10,12 +10,13 @@
byte RgbDontUse[8 * 1024]; // Remove this array when we can compute the size of a cbor serialization without this hack.
+COSE * EncryptRoot = NULL;
+
bool IsValidEncryptHandle(HCOSE_ENCRYPT h)
{
COSE_Encrypt * p = (COSE_Encrypt *)h;
- if (p == NULL) return false;
- return true;
+ return _COSE_IsInList(EncryptRoot, &p->m_message);
}
@@ -32,6 +33,8 @@
return NULL;
}
+ _COSE_InsertInList(&EncryptRoot, &pobj->m_message);
+
return (HCOSE_ENCRYPT) pobj;
}
@@ -57,6 +60,8 @@
pRecipients = _COSE_arrayget_int(&pobj->m_message, INDEX_RECIPIENTS);
CHECK_CONDITION(pRecipients == NULL, COSE_ERR_INVALID_PARAMETER);
+ _COSE_InsertInList(&EncryptRoot, &pobj->m_message);
+
return(HCOSE_ENCRYPT) pobj;
}
@@ -65,6 +70,7 @@
#ifdef USE_CBOR_CONTEXT
cn_cbor_context context;
#endif
+ COSE_Encrypt * pEncrypt = (COSE_Encrypt *)h;
if (!IsValidEncryptHandle(h)) return false;
@@ -72,8 +78,10 @@
context = ((COSE_Encrypt *)h)->m_message.m_allocContext;
#endif
- _COSE_Encrypt_Release((COSE_Encrypt *)h);
+ _COSE_Encrypt_Release(pEncrypt);
+ _COSE_RemoveFromList(&EncryptRoot, &pEncrypt->m_message);
+
COSE_FREE((COSE_Encrypt *)h, &context);
return true;
diff --git a/src/cose.h b/src/cose.h
index 9430f3a..99e47ae 100644
--- a/src/cose.h
+++ b/src/cose.h
@@ -143,6 +143,7 @@
COSE_Parameter_KID = 4,
} COSE_Constants;
+
/*
* messages dealing with the Enveloped message type
*/
diff --git a/src/cose_int.h b/src/cose_int.h
index d46f501..5640946 100644
--- a/src/cose_int.h
+++ b/src/cose_int.h
@@ -3,7 +3,7 @@
// These definitions are here because they aren't required for the public
// interface, and they were quite confusing in cn-cbor.h
-typedef struct {
+typedef struct _COSE {
int m_flags; // Not sure what goes here yet
int m_ownMsg; // Do I own the pointer @ m_cbor?
int m_ownUnprotectedMap; // Do I own the pointer @ m_unportectedMap?
@@ -17,6 +17,7 @@
#ifdef USE_CBOR_CONTEXT
cn_cbor_context m_allocContext;
#endif
+ struct _COSE * m_handleList;
} COSE;
struct _SignerInfo;
@@ -125,6 +126,14 @@
extern cose_error _MapFromCBOR(cn_cbor_errback err);
+/*
+ * Set of routines for handle checking
+ */
+
+extern void _COSE_InsertInList(COSE ** rootNode, COSE * newMsg);
+extern bool _COSE_IsInList(COSE * rootNode, COSE * thisMsg);
+extern void _COSE_RemoveFromList(COSE ** rootNode, COSE * thisMsg);
+
extern bool IsValidEncryptHandle(HCOSE_ENCRYPT h);
extern bool IsValidEnvelopedHandle(HCOSE_ENVELOPED h);
extern bool IsValidRecipientHandle(HCOSE_RECIPIENT h);
diff --git a/test/test.c b/test/test.c
index 69117c5..0774d6a 100644
--- a/test/test.c
+++ b/test/test.c
@@ -197,7 +197,7 @@
}
else if (strcmp(pKey->v.str, "IV_hex") == 0) {
keyNew = COSE_Header_IV;
- pValueNew = cn_cbor_data_create(FromHex(pValue->v.str, pValue->length), pValue->length / 2, CBOR_CONTEXT_PARAM_COMMA NULL);
+ pValueNew = cn_cbor_data_create(FromHex(pValue->v.str, pValue->length), (int) pValue->length / 2, CBOR_CONTEXT_PARAM_COMMA NULL);
}
else {
continue;