Cannot put the same attribute into a map twice
diff --git a/src/Cose.c b/src/Cose.c
index 9cbac96..de37bcc 100644
--- a/src/Cose.c
+++ b/src/Cose.c
@@ -308,15 +308,11 @@
cn_cbor_context * context = &pCose->m_allocContext;
#endif
cn_cbor_errback error;
- bool f;
+ bool f = false;
- if ((flags & COSE_BOTH) == COSE_BOTH) {
- if (perr != NULL) perr->err = COSE_ERR_INVALID_PARAMETER;
- errorReturn:
- return false;
- }
-
- if (perr != NULL) perr->err = COSE_ERR_NONE;
+ CHECK_CONDITION(cn_cbor_mapget_int(pCose->m_protectedMap, key) == NULL, COSE_ERR_INVALID_PARAMETER);
+ CHECK_CONDITION(cn_cbor_mapget_int(pCose->m_unprotectMap, key) == NULL, COSE_ERR_INVALID_PARAMETER);
+ CHECK_CONDITION(cn_cbor_mapget_int(pCose->m_dontSendMap, key) == NULL, COSE_ERR_INVALID_PARAMETER);
switch (flags) {
case COSE_PROTECT_ONLY:
@@ -342,6 +338,7 @@
CHECK_CONDITION(f, _MapFromCBOR(error));
+errorReturn:
return f;
}
diff --git a/src/Encrypt.c b/src/Encrypt.c
index cd1ba35..48cb54e 100644
--- a/src/Encrypt.c
+++ b/src/Encrypt.c
@@ -345,6 +345,7 @@
cn_Alg = _COSE_map_get_int(&pcose->m_message, COSE_Header_Algorithm, COSE_BOTH, perr);
if (cn_Alg == NULL) goto errorReturn;
+ CHECK_CONDITION((cn_Alg->type != CN_CBOR_TEXT), COSE_ERR_UNKNOWN_ALGORITHM);
CHECK_CONDITION((cn_Alg->type == CN_CBOR_UINT) || (cn_Alg->type == CN_CBOR_INT), COSE_ERR_INVALID_PARAMETER);
alg = (int) cn_Alg->v.uint;
diff --git a/src/Encrypt0.c b/src/Encrypt0.c
index 9135959..0d8e78b 100644
--- a/src/Encrypt0.c
+++ b/src/Encrypt0.c
@@ -281,6 +281,7 @@
cn_Alg = _COSE_map_get_int(&pcose->m_message, COSE_Header_Algorithm, COSE_BOTH, perr);
if (cn_Alg == NULL) goto errorReturn;
+ CHECK_CONDITION(cn_Alg->type != CN_CBOR_TEXT, COSE_ERR_UNKNOWN_ALGORITHM);
CHECK_CONDITION((cn_Alg->type == CN_CBOR_UINT) || (cn_Alg->type == CN_CBOR_INT), COSE_ERR_INVALID_PARAMETER);
alg = (int) cn_Alg->v.uint;
@@ -308,7 +309,7 @@
case COSE_Algorithm_AES_GCM_256: cbitKey = 256; break;
default:
- FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
+ FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
}
// Build protected headers
diff --git a/src/MacMessage.c b/src/MacMessage.c
index 78bdcfc..6a1a9f8 100644
--- a/src/MacMessage.c
+++ b/src/MacMessage.c
@@ -322,7 +322,8 @@
cn_Alg = _COSE_map_get_int(&pcose->m_message, COSE_Header_Algorithm, COSE_BOTH, perr);
if (cn_Alg == NULL) goto errorReturn;
- CHECK_CONDITION(((cn_Alg->type == CN_CBOR_UINT || cn_Alg->type == CN_CBOR_INT)), COSE_ERR_INVALID_PARAMETER);
+ CHECK_CONDITION(cn_Alg->type != CN_CBOR_TEXT, COSE_ERR_UNKNOWN_ALGORITHM);
+ CHECK_CONDITION(((cn_Alg->type == CN_CBOR_UINT || cn_Alg->type == CN_CBOR_INT)), COSE_ERR_UNKNOWN_ALGORITHM);
alg = (int) cn_Alg->v.uint;
@@ -350,7 +351,7 @@
break;
default:
- FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
+ FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
}
// If we are doing direct encryption - then recipient generates the key
diff --git a/src/MacMessage0.c b/src/MacMessage0.c
index 1a61ffa..04b781b 100644
--- a/src/MacMessage0.c
+++ b/src/MacMessage0.c
@@ -219,6 +219,7 @@
cn_Alg = _COSE_map_get_int(&pcose->m_message, COSE_Header_Algorithm, COSE_BOTH, perr);
if (cn_Alg == NULL) goto errorReturn;
+ CHECK_CONDITION(cn_Alg->type != CN_CBOR_TEXT, COSE_ERR_UNKNOWN_ALGORITHM);
CHECK_CONDITION(((cn_Alg->type == CN_CBOR_UINT || cn_Alg->type == CN_CBOR_INT)), COSE_ERR_INVALID_PARAMETER);
alg = (int) cn_Alg->v.uint;
@@ -247,7 +248,7 @@
break;
default:
- FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
+ FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
}
// Build protected headers
diff --git a/src/Sign0.c b/src/Sign0.c
index 93c2184..1b8528f 100644
--- a/src/Sign0.c
+++ b/src/Sign0.c
@@ -362,7 +362,7 @@
break;
default:
- FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
+ FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
}
COSE_FREE(pbToSign, context);
diff --git a/src/SignerInfo.c b/src/SignerInfo.c
index 8374d6f..24f34c8 100644
--- a/src/SignerInfo.c
+++ b/src/SignerInfo.c
@@ -212,7 +212,7 @@
break;
default:
- FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
+ FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
}
fRet = true;
diff --git a/src/cbor.c b/src/cbor.c
index 31b6ddf..40f5144 100644
--- a/src/cbor.c
+++ b/src/cbor.c
@@ -160,3 +160,15 @@
return pcnTag;
}
+
+cn_cbor * cn_cbor_bool_create(int boolValue, CBOR_CONTEXT_COMMA cn_cbor_errback * errp)
+{
+ cn_cbor * pcn = CN_CALLOC(context);
+ if (pcn == NULL) {
+ if (errp != NULL) errp->err = CN_CBOR_ERR_OUT_OF_MEMORY;
+ return NULL;
+ }
+
+ pcn->type = CN_CBOR_FALSE + (boolValue != 0);
+ return pcn;
+}
diff --git a/src/cose.h b/src/cose.h
index 200d163..7232bb6 100644
--- a/src/cose.h
+++ b/src/cose.h
@@ -150,6 +150,7 @@
COSE_Header_KDF_PUB_other = -999,
COSE_Header_KDF_PRIV = -998,
+ COSE_Header_UseCompressedECDH = -997,
COSE_Header_ECDH_EPHEMERAL = -1,
COSE_Header_ECDH_STATIC = -2
@@ -302,4 +303,4 @@
extern cn_cbor * cn_cbor_clone(const cn_cbor * pIn, CBOR_CONTEXT_COMMA cn_cbor_errback * perr);
extern cn_cbor * cn_cbor_tag_create(int tag, cn_cbor * child, CBOR_CONTEXT_COMMA cn_cbor_errback * perr);
-
+extern cn_cbor * cn_cbor_bool_create(int boolValue, CBOR_CONTEXT_COMMA cn_cbor_errback * errp);
\ No newline at end of file
diff --git a/src/cose_int.h b/src/cose_int.h
index b51fcf8..ead32c2 100644
--- a/src/cose_int.h
+++ b/src/cose_int.h
@@ -197,8 +197,8 @@
//
// Debugging Items
-#define DO_ASSERT assert(false);
-//#define DO_ASSERT
+//#define DO_ASSERT assert(false);
+#define DO_ASSERT
#define CHECK_CONDITION(condition, error) { if (!(condition)) { DO_ASSERT; if (perr != NULL) {perr->err = error;} goto errorReturn;}}
#define FAIL_CONDITION(error) { DO_ASSERT; if (perr != NULL) {perr->err = error;} goto errorReturn;}
#define CHECK_CONDITION_CBOR(condition, error) { if (!(condition)) { DO_ASSERT; if (perr != NULL) {perr->err = _MapFromCBOR(error);} goto errorReturn;}}
@@ -234,6 +234,7 @@
/// NEW CBOR FUNCTIONS
bool cn_cbor_array_replace(cn_cbor * cb_array, cn_cbor * cb_value, int index, CBOR_CONTEXT_COMMA cn_cbor_errback *errp);
+cn_cbor * cn_cbor_bool_create(int boolValue, CBOR_CONTEXT_COMMA cn_cbor_errback * errp);
enum {
diff --git a/test/encrypt.c b/test/encrypt.c
index 68ca8bf..0cf8193 100644
--- a/test/encrypt.c
+++ b/test/encrypt.c
@@ -441,6 +441,8 @@
//
// Unsupported algorithm
+ // Bad Int algorithm
+
hEncrypt = COSE_Enveloped_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
if (hEncrypt == NULL) CFails++;
CHECK_RETURN(COSE_Enveloped_SetContent(hEncrypt, (byte *) "Message", 7, &cose_error), COSE_ERR_NONE, CFails++);
@@ -449,8 +451,17 @@
if (hRecipient == NULL) CFails++;
CHECK_RETURN(COSE_Enveloped_AddRecipient(hEncrypt, hRecipient, &cose_error), COSE_ERR_NONE, CFails++);
CHECK_FAILURE(COSE_Enveloped_encrypt(hEncrypt, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Recipient_Free(hRecipient);
+ COSE_Enveloped_Free(hEncrypt);
+
+ hEncrypt = COSE_Enveloped_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hEncrypt == NULL) CFails++;
+ CHECK_RETURN(COSE_Enveloped_SetContent(hEncrypt, (byte *) "Message", 7, &cose_error), COSE_ERR_NONE, CFails++);
CHECK_RETURN(COSE_Enveloped_map_put_int(hEncrypt, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, &cose_error), COE_ERR_NONE, CFails++);
+ hRecipient = COSE_Recipient_from_shared_secret(rgb, sizeof(rgb), rgb, sizeof(rgb), CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hRecipient == NULL) CFails++;
+ CHECK_RETURN(COSE_Enveloped_AddRecipient(hEncrypt, hRecipient, &cose_error), COSE_ERR_NONE, CFails++);
CHECK_FAILURE(COSE_Enveloped_encrypt(hEncrypt, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
//
@@ -459,6 +470,9 @@
CHECK_FAILURE_PTR(COSE_Enveloped_GetRecipient(hEncrypt, -1, &cose_error), COSE_ERR_INVALID_PARAMETER, CFails++);
CHECK_FAILURE_PTR(COSE_Enveloped_GetRecipient(hEncrypt, 9, &cose_error), COSE_ERR_INVALID_PARAMETER, CFails++);
+ COSE_Enveloped_Free(hEncrypt);
+ COSE_Recipient_Free(hRecipient);
+
return;
}
@@ -467,6 +481,7 @@
HCOSE_ENCRYPT hEncrypt = NULL;
byte rgb[10];
cn_cbor * cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+ cose_errback cose_error;
// Missing case - addref then release on item
@@ -499,10 +514,15 @@
if (hEncrypt == NULL) CFails++;
if (!COSE_Encrypt_SetContent(hEncrypt, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Encrypt_map_put_int(hEncrypt, COSE_Header_Algorithm, cn_cbor_int_create(-99, CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Encrypt_encrypt(hEncrypt, rgb, sizeof(rgb), NULL)) CFails++;
+ CHECK_FAILURE(COSE_Encrypt_encrypt(hEncrypt, rgb, sizeof(rgb), &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Encrypt_Free(hEncrypt);
- if (!COSE_Encrypt_map_put_int(hEncrypt, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Encrypt_encrypt(hEncrypt, rgb, sizeof(rgb), NULL)) CFails++;
+ hEncrypt = COSE_Encrypt_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hEncrypt == NULL) CFails++;
+ if (!COSE_Encrypt_SetContent(hEncrypt, (byte *) "Message", 7, NULL)) CFails++;
+ if (!COSE_Encrypt_map_put_int(hEncrypt, COSE_Header_Algorithm, cn_cbor_int_create(-99, CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Encrypt_encrypt(hEncrypt, rgb, sizeof(rgb), &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Encrypt_Free(hEncrypt);
return;
}
diff --git a/test/mac_test.c b/test/mac_test.c
index 92610d5..dc8ef1c 100644
--- a/test/mac_test.c
+++ b/test/mac_test.c
@@ -367,6 +367,7 @@
HCOSE_RECIPIENT hRecipient = NULL;
byte rgb[10];
cn_cbor * cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+ cose_errback cose_error;
// Missing case - addref then release on item
@@ -408,11 +409,22 @@
hRecipient = COSE_Recipient_from_shared_secret(rgb, sizeof(rgb), rgb, sizeof(rgb), CBOR_CONTEXT_PARAM_COMMA NULL);
if (hRecipient == NULL) CFails++;
if (!COSE_Mac_AddRecipient(hMAC, hRecipient, NULL)) CFails++;
- if (COSE_Mac_encrypt(hMAC, NULL)) CFails++;
- if (COSE_Mac_GetRecipient(hMAC, 9, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Mac_encrypt(hMAC, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Mac_Free(hMAC);
+ COSE_Recipient_Free(hRecipient);
+ hMAC = COSE_Mac_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hMAC == NULL) CFails++;
+ if (!COSE_Mac_SetContent(hMAC, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Mac_map_put_int(hMAC, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Mac_encrypt(hMAC, NULL)) CFails++;
+ hRecipient = COSE_Recipient_from_shared_secret(rgb, sizeof(rgb), rgb, sizeof(rgb), CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hRecipient == NULL) CFails++;
+ if (!COSE_Mac_AddRecipient(hMAC, hRecipient, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Mac_encrypt(hMAC, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Recipient_Free(hRecipient);
+ COSE_Mac_Free(hMAC);
+
+ if (COSE_Mac_GetRecipient(hMAC, 9, NULL)) CFails++;
return;
}
@@ -423,6 +435,7 @@
HCOSE_MAC0 hMAC;
byte rgb[10];
cn_cbor * cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+ cose_errback cose_error;
hEncrypt = COSE_Encrypt_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
@@ -456,11 +469,15 @@
if (hMAC == NULL) CFails++;
if (!COSE_Mac0_SetContent(hMAC, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Mac0_map_put_int(hMAC, COSE_Header_Algorithm, cn_cbor_int_create(-99, CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Mac0_encrypt(hMAC, rgb, sizeof(rgb), NULL)) CFails++;
+ CHECK_FAILURE(COSE_Mac0_encrypt(hMAC, rgb, sizeof(rgb), &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Mac0_Free(hMAC);
+ hMAC = COSE_Mac0_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hMAC == NULL) CFails++;
+ if (!COSE_Mac0_SetContent(hMAC, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Mac0_map_put_int(hMAC, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Mac0_encrypt(hMAC, rgb, sizeof(rgb), NULL)) CFails++;
-
+ CHECK_FAILURE(COSE_Mac0_encrypt(hMAC, rgb, sizeof(rgb), &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Mac0_Free(hMAC);
return;
}
diff --git a/test/sign.c b/test/sign.c
index 05d62d8..d9d86aa 100644
--- a/test/sign.c
+++ b/test/sign.c
@@ -354,6 +354,7 @@
HCOSE_SIGNER hSigner2;
byte rgb[10];
cn_cbor * cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+ cose_errback cose_error;
hSign2 = COSE_Sign_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
hSigner2 = COSE_Signer_Init(CBOR_CONTEXT_PARAM_COMMA NULL);
@@ -413,11 +414,27 @@
if (!COSE_Sign_SetContent(hSign, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Signer_map_put_int(hSigner, COSE_Header_Algorithm, cn_cbor_int_create(-99, CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
if (!COSE_Sign_AddSigner(hSign, hSigner, NULL)) CFails++;
- if (COSE_Sign_Sign(hSign, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Sign_Sign(hSign, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ if (COSE_Sign_GetSigner(hSign, 9, NULL)) CFails++;
+ COSE_Sign_Free(hSign);
+ COSE_Signer_Free(hSigner);
+
+ hSign = COSE_Sign_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hSign == NULL) CFails++;
+ hSigner = COSE_Signer_Init(CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hSigner == NULL) CFails++;
+
+ if (!COSE_Sign_SetContent(hSign, (byte *) "Message", 7, NULL)) CFails++;
+ if (!COSE_Signer_map_put_int(hSigner, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
+ if (!COSE_Sign_AddSigner(hSign, hSigner, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Sign_Sign(hSign, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
if (COSE_Sign_GetSigner(hSign, 9, NULL)) CFails++;
- if (!COSE_Signer_map_put_int(hSigner, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Sign_Sign(hSign, NULL)) CFails++;
+ cn = COSE_Signer_map_get_int(hSigner, COSE_Header_Algorithm, COSE_BOTH, &cose_error);
+ if (cn != NULL) {
+ if (cn->type != CN_CBOR_TEXT) CFails++;
+ }
+ else CFails++;
return;
}
@@ -428,6 +445,7 @@
HCOSE_SIGN0 hSign2;
byte rgb[10];
cn_cbor * cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);
+ cose_errback cose_error;
hSign2 = COSE_Sign0_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
// Missing case - addref then release on item
@@ -462,10 +480,18 @@
if (!COSE_Sign0_SetContent(hSign, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Sign0_map_put_int(hSign, COSE_Header_Algorithm, cn_cbor_int_create(-99, CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Sign0_Sign(hSign, cn, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Sign0_Sign(hSign, cn, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+ COSE_Sign0_Free(hSign);
+
+ hSign = COSE_Sign0_Init(0, CBOR_CONTEXT_PARAM_COMMA NULL);
+ if (hSign == NULL) CFails++;
+
+ if (!COSE_Sign0_SetContent(hSign, (byte *) "Message", 7, NULL)) CFails++;
if (!COSE_Sign0_map_put_int(hSign, COSE_Header_Algorithm, cn_cbor_string_create("hmac", CBOR_CONTEXT_PARAM_COMMA NULL), COSE_PROTECT_ONLY, NULL)) CFails++;
- if (COSE_Sign0_Sign(hSign, cn, NULL)) CFails++;
+ CHECK_FAILURE(COSE_Sign0_Sign(hSign, cn, &cose_error), COSE_ERR_UNKNOWN_ALGORITHM, CFails++);
+
+ COSE_Sign0_Free(hSign);
return;
}
diff --git a/test/test.c b/test/test.c
index 6220068..37bc301 100644
--- a/test/test.c
+++ b/test/test.c
@@ -793,7 +793,7 @@
}
else {
#ifdef USE_CBOR_CONTEXT
- allocator = CreateContext(-1);
+ allocator = CreateContext((unsigned int) -1);
#endif
MacMessage();
SignMessage();