Merge pull request #38 from jimsch/master
Testing Cleanup work
diff --git a/src/Cose.c b/src/Cose.c
index 382a4ce..2de060e 100644
--- a/src/Cose.c
+++ b/src/Cose.c
@@ -388,6 +388,90 @@
return pProtected;
}
+#ifdef USE_COUNTER_SIGNATURES
+bool _COSE_CounterSign_add(COSE * pMessage, HCOSE_COUNTERSIGN hSigner, cose_errback * perr)
+{
+ COSE_CounterSign * pSigner = (COSE_CounterSign *)hSigner;
+
+ CHECK_CONDITION(IsValidCounterSignHandle(hSigner), COSE_ERR_INVALID_HANDLE);
+ CHECK_CONDITION(pSigner->m_signer.m_signerNext == NULL, COSE_ERR_INVALID_PARAMETER);
+
+ pSigner = pMessage->m_counterSigners;
+ pMessage->m_counterSigners = pSigner;
+ return true;
+
+errorReturn:
+ return false;
+}
+
+HCOSE_COUNTERSIGN _COSE_CounterSign_get(COSE * pMessage, int iSigner, cose_errback * perr)
+{
+ COSE_SignerInfo * pSigner = pMessage->m_counterSigners;
+ int i;
+
+ for (i = 0; i < iSigner; i++, pSigner = pSigner->m_signerNext) {
+ CHECK_CONDITION(pSigner != NULL, COSE_ERR_INVALID_PARAMETER);
+ }
+
+ return pSigner;
+
+errorReturn:
+ return false;
+}
+
+bool _COSE_CountSign_create(COSE * pMessage, cn_cbor * pcnBody, CBOR_CONTEXT_COMMA cose_errback * perr)
+{
+ cn_cbor * pArray = NULL;
+ cn_cbor_errback cbor_err;
+ COSE_CounterSign * pSigner = NULL;
+ cn_cbor * pcnProtected = NULL;
+ cn_cbor * pcn;
+ cn_cbor * pcn2;
+
+ if (pMessage->m_counterSigners == NULL) return true;
+
+ // One or more than one?
+ if (pMessage->m_counterSigners->m_signer.m_signerNext != NULL) {
+ pArray = cn_cbor_array_create(CBOR_CONTEXT_PARAM_COMMA &cbor_err);
+ CHECK_CONDITION_CBOR(pArray != NULL, cbor_err);
+ }
+
+ pcnProtected = _COSE_arrayget_int(pMessage, INDEX_PROTECTED);
+ CHECK_CONDITION(pcnProtected != NULL, COSE_ERR_INTERNAL);
+
+ for (pSigner = pMessage->m_counterSigners; pSigner != NULL; pSigner = pSigner->m_signer.m_signerNext) {
+ pcn = cn_cbor_data_create(pcnProtected->v.bytes, pcnProtected->v.count, CBOR_CONTEXT_PARAM_COMMA &cbor_err);
+ CHECK_CONDITION_CBOR(pcnProtected != NULL, cbor_err);
+
+ pcn2 = cn_cbor_clone(pcnBody, CBOR_CONTEXT_PARAM_COMMA &cbor_err);
+ CHECK_CONDITION_CBOR(pcnBody != NULL, cbor_err);
+
+ if (!_COSE_Signer_sign(pSigner, pcnBody, pcn2, perr)) goto errorReturn;
+ pcn = NULL;
+ pcn2 = NULL;
+
+ if (pArray != NULL) {
+ bool f = cn_cbor_array_append(pArray, pSigner->m_signer.m_message.m_cborRoot, &cbor_err);
+ CHECK_CONDITION_CBOR(f, cbor_err);
+ }
+ else {
+ pArray = pSigner->m_signer.m_message.m_cborRoot;
+ }
+ }
+
+ if (!_COSE_map_put(pMessage, COSE_Header_CounterSign, pArray, COSE_UNPROTECT_ONLY, perr)) goto errorReturn;
+
+ return true;
+
+errorReturn:
+ if (pArray != NULL) CN_CBOR_FREE(pArray, context);
+ if ((pcn != NULL) && (pcn->parent != NULL)) CN_CBOR_FREE(pcn, context);
+ if ((pcn2 != NULL) && (pcn2->parent != NULL)) CN_CBOR_FREE(pcn2, context);
+ return false;
+}
+
+#endif
+
bool _COSE_array_replace(COSE * pMessage, cn_cbor * cb_value, int index, CBOR_CONTEXT_COMMA cn_cbor_errback * errp)
{
#ifdef TAG_IN_ARRAY
diff --git a/src/Encrypt.c b/src/Encrypt.c
index 8132572..408bdcc 100644
--- a/src/Encrypt.c
+++ b/src/Encrypt.c
@@ -170,7 +170,7 @@
CHECK_CONDITION(IsValidRecipientHandle(hRecip), COSE_ERR_INVALID_HANDLE);
CHECK_CONDITION(pcose->m_recipientFirst != NULL, COSE_ERR_INVALID_PARAMETER);
- f = _COSE_Enveloped_decrypt(pcose, pRecip, NULL, 0, "Enveloped", perr);
+ f = _COSE_Enveloped_decrypt(pcose, pRecip, NULL, 0, "Encrypt", perr);
errorReturn:
return f;
@@ -181,8 +181,8 @@
int alg;
const cn_cbor * cn = NULL;
- byte * pbKey = pbKeyIn;
- size_t cbitKey = cbKeyIn * 8;
+ byte * pbKey = NULL;
+ size_t cbitKey = 0;
#ifdef USE_CBOR_CONTEXT
cn_cbor_context * context;
#endif
@@ -285,7 +285,11 @@
// We are doing the enveloped item - so look for the passed in recipient
//
- if (pbKeyIn == NULL) {
+ if (pbKeyIn != NULL) {
+ CHECK_CONDITION(cbKeyIn == cbitKey / 8, COSE_ERR_INVALID_PARAMETER);
+ pbKey = pbKeyIn;
+ }
+ else {
// Allocate the key if we have not already done so
if (pbKey == NULL) {
@@ -303,7 +307,7 @@
if (!_COSE_Recipient_decrypt(pRecipX, pRecip, alg, cbitKey, pbKey, perr)) goto errorReturn;
break;
}
- else if (pRecipX->m_recipientNext != NULL) {
+ else if (pRecipX->m_encrypt.m_recipientFirst != NULL) {
if (_COSE_Recipient_decrypt(pRecipX, pRecip, alg, cbitKey, pbKey, perr)) break;
}
}
@@ -410,7 +414,7 @@
CHECK_CONDITION(IsValidEnvelopedHandle(h), COSE_ERR_INVALID_HANDLE);
CHECK_CONDITION(pcose->m_recipientFirst != NULL, COSE_ERR_INVALID_HANDLE);
- return _COSE_Enveloped_encrypt(pcose, NULL, 0, "Enveloped", perr);
+ return _COSE_Enveloped_encrypt(pcose, NULL, 0, "Encrypt", perr);
errorReturn:
return false;
@@ -550,6 +554,13 @@
const cn_cbor * cbProtected = _COSE_encode_protected(&pcose->m_message, perr);
if (cbProtected == NULL) goto errorReturn;
+#ifdef USE_COUNTER_SIGNATURES
+ // Setup Counter Signatures
+ if (!_COSE_CountSign_create(&pcose->m_message, NULL, CBOR_CONTEXT_PARAM_COMMA perr)) {
+ goto errorReturn;
+ }
+#endif
+
// Build authenticated data
size_t cbAuthData = 0;
@@ -848,3 +859,23 @@
errorReturn:
return (HCOSE_RECIPIENT)p;
}
+
+#ifdef USE_COUNTER_SIGNATURES
+bool COSE_Enveloped_AddCounterSigner(HCOSE_ENCRYPT hEnv, HCOSE_COUNTERSIGN hSign, cose_errback * perr)
+{
+ CHECK_CONDITION(IsValidEncryptHandle(hEnv), COSE_ERR_INVALID_HANDLE);
+ return _COSE_CounterSign_add(&((COSE_Enveloped *)hEnv)->m_message, hSign, perr);
+
+errorReturn:
+ return false;
+}
+
+HCOSE_COUNTERSIGN COSE_Enveloped_GetCounterSigner(HCOSE_ENCRYPT h, int iSigner, cose_errback * perr)
+{
+ CHECK_CONDITION(IsValidEncryptHandle(h), COSE_ERR_INVALID_HANDLE);
+ return _COSE_CounterSign_get(&((COSE_Enveloped *)h)->m_message, iSigner, perr);
+
+errorReturn:
+ return NULL;
+}
+#endif
diff --git a/src/Encrypt0.c b/src/Encrypt0.c
index b24fdf2..4103292 100644
--- a/src/Encrypt0.c
+++ b/src/Encrypt0.c
@@ -128,7 +128,7 @@
return false;
}
- f = _COSE_Enveloped_decrypt(pcose, NULL, pbKey, cbKey, "Encrypted", perr);
+ f = _COSE_Enveloped_decrypt(pcose, NULL, pbKey, cbKey, "Encrypt1", perr);
return f;
}
@@ -137,7 +137,7 @@
CHECK_CONDITION(IsValidEncryptHandle(h), COSE_ERR_INVALID_HANDLE);
CHECK_CONDITION(pbKey != NULL, COSE_ERR_INVALID_PARAMETER);
- return _COSE_Enveloped_encrypt((COSE_Encrypt *)h, pbKey, cbKey, "Encrypted", perr);
+ return _COSE_Enveloped_encrypt((COSE_Encrypt *)h, pbKey, cbKey, "Encrypt1", perr);
errorReturn:
return false;
diff --git a/src/MacMessage.c b/src/MacMessage.c
index df62f1e..0c085c7 100644
--- a/src/MacMessage.c
+++ b/src/MacMessage.c
@@ -617,7 +617,7 @@
if (!_COSE_Recipient_decrypt(pRecipX, pRecip, alg, cbitKey, pbKey, perr)) goto errorReturn;
break;
}
- else if (pRecipX->m_recipientNext != NULL) {
+ else if (pRecipX->m_encrypt.m_recipientFirst != NULL) {
if (_COSE_Recipient_decrypt(pRecipX, pRecip, alg, cbitKey, pbKey, perr)) break;
}
}
diff --git a/src/MacMessage0.c b/src/MacMessage0.c
index 43df47b..2702985 100644
--- a/src/MacMessage0.c
+++ b/src/MacMessage0.c
@@ -222,161 +222,3 @@
errorReturn:
return false;
}
-
-#if 0
- int foo() {
- COSE_Mac0Message * pcose = (COSE_Mac0Message *)h;
- byte * pbAuthData = NULL;
- int cbitKey = 0;
- bool fRet = false;
- int alg;
- const cn_cbor * cn = NULL;
-
-#ifdef USE_CBOR_CONTEXT
- cn_cbor_context * context = NULL;
-#endif
- size_t cbAuthData;
-
- CHECK_CONDITION(IsValidMac0Handle(h), COSE_ERR_INVALID_PARAMETER);
-
-#ifdef USE_CBOR_CONTEXT
- context = &pcose->m_message.m_allocContext;
-#endif
-
- cn = _COSE_map_get_int(&pcose->m_message, COSE_Header_Algorithm, COSE_BOTH, perr);
- if (cn == NULL) goto errorReturn;
-
- if (cn->type == CN_CBOR_TEXT) {
- FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
- }
- else {
- CHECK_CONDITION((cn->type == CN_CBOR_UINT || cn->type == CN_CBOR_INT), COSE_ERR_INVALID_PARAMETER);
-
- alg = (int)cn->v.uint;
-
- switch (alg) {
-#ifdef USE_AES_CBC_MAC_128_64
- case COSE_Algorithm_CBC_MAC_128_64:
- cbitKey = 128;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_128_128
- case COSE_Algorithm_CBC_MAC_128_128:
- cbitKey = 128;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_256_64
- case COSE_Algorithm_CBC_MAC_256_64:
- cbitKey = 256;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_256_128
- case COSE_Algorithm_CBC_MAC_256_128:
- cbitKey = 256;
- break;
-#endif
-
-#ifdef USE_HMAC_256_64
- case COSE_Algorithm_HMAC_256_64:
- cbitKey = 256;
- break;
-#endif
-
-#ifdef USE_HMAC_256_256
- case COSE_Algorithm_HMAC_256_256:
- cbitKey = 256;
- break;
-#endif
-
-#ifdef USE_HMAC_384_384
- case COSE_Algorithm_HMAC_384_384:
- cbitKey = 384;
- break;
-#endif
-
-#ifdef USE_HMAC_512_512
- case COSE_Algorithm_HMAC_512_512:
- cbitKey = 512;
- break;
-#endif
-
- default:
- FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
- break;
- }
- }
-
- // Build protected headers
-
- cn_cbor * cnProtected = _COSE_arrayget_int(&pcose->m_message, INDEX_PROTECTED);
- CHECK_CONDITION((cnProtected != NULL) && (cnProtected->type == CN_CBOR_BYTES), COSE_ERR_INVALID_PARAMETER);
-
- // Build authenticated data
- if (!_COSE_Mac_Build_AAD(&pcose->m_message, "MAC0", &pbAuthData, &cbAuthData, CBOR_CONTEXT_PARAM_COMMA perr)) goto errorReturn;
-
- switch (alg) {
-#ifdef USE_HMAC_256_256
- case COSE_Algorithm_HMAC_256_256:
- if (!HMAC_Validate((COSE_MacMessage *)pcose, 256, 256, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_HMAC_256_64
- case COSE_Algorithm_HMAC_256_64:
- if (!HMAC_Validate((COSE_MacMessage *)pcose, 256, 64, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_HMAC_384_384
- case COSE_Algorithm_HMAC_384_384:
- if (!HMAC_Validate((COSE_MacMessage *)pcose, 384, 384, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_HMAC_512_512
- case COSE_Algorithm_HMAC_512_512:
- if (!HMAC_Validate((COSE_MacMessage *)pcose, 512, 512, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_128_64
- case COSE_Algorithm_CBC_MAC_128_64:
- if (!AES_CBC_MAC_Validate((COSE_MacMessage *)pcose, 64, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_256_64
- case COSE_Algorithm_CBC_MAC_256_64:
- if (!AES_CBC_MAC_Validate((COSE_MacMessage *)pcose, 64, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_128_128
- case COSE_Algorithm_CBC_MAC_128_128:
- if (!AES_CBC_MAC_Validate((COSE_MacMessage *)pcose, 128, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
-#ifdef USE_AES_CBC_MAC_256_128
- case COSE_Algorithm_CBC_MAC_256_128:
- if (!AES_CBC_MAC_Validate((COSE_MacMessage *)pcose, 128, pbKey, cbKey, pbAuthData, cbAuthData, perr)) goto errorReturn;
- break;
-#endif
-
- default:
- FAIL_CONDITION(COSE_ERR_UNKNOWN_ALGORITHM);
- break;
- }
-
- fRet = true;
-
- errorReturn:
- if (pbAuthData != NULL) COSE_FREE(pbAuthData, context);
-
- return fRet;
- }
-
-#endif
\ No newline at end of file
diff --git a/src/Recipient.c b/src/Recipient.c
index ff6cc02..3b21268 100644
--- a/src/Recipient.c
+++ b/src/Recipient.c
@@ -288,10 +288,12 @@
#ifdef USE_Direct_HKDF_AES_128
case COSE_Algorithm_Direct_HKDF_AES_128:
+ break;
#endif
#ifdef USE_Direct_HKDF_AES_256
case COSE_Algorithm_Direct_HKDF_AES_256:
+ break;
#endif
#ifdef USE_Direct_HKDF_HMAC_SHA_256
diff --git a/src/SignerInfo.c b/src/SignerInfo.c
index dd21e33..55dc346 100644
--- a/src/SignerInfo.c
+++ b/src/SignerInfo.c
@@ -34,7 +34,6 @@
return true;
}
-
bool COSE_Signer_Free(HCOSE_SIGNER hSigner)
{
COSE_SignerInfo * pSigner = (COSE_SignerInfo *)hSigner;
@@ -67,7 +66,7 @@
return NULL;
}
- if (!_COSE_Init(COSE_INIT_FLAGS_NO_CBOR_TAG, &pobj->m_message, COSE_recipient_object, CBOR_CONTEXT_PARAM_COMMA perror)) {
+ if (!_COSE_SignerInfo_Init(COSE_INIT_FLAGS_NO_CBOR_TAG, pobj, COSE_recipient_object, CBOR_CONTEXT_PARAM_COMMA perror)) {
_COSE_SignerInfo_Free(pobj);
COSE_FREE(pobj, context);
return NULL;
@@ -77,6 +76,10 @@
return (HCOSE_SIGNER)pobj;
}
+bool _COSE_SignerInfo_Init(COSE_INIT_FLAGS flags, COSE_SignerInfo * pobj, int msgType, CBOR_CONTEXT_COMMA cose_errback * errp)
+{
+ return _COSE_Init(flags, &pobj->m_message, msgType, CBOR_CONTEXT_PARAM_COMMA errp);
+}
COSE_SignerInfo * _COSE_SignerInfo_Init_From_Object(cn_cbor * cbor, COSE_SignerInfo * pIn, CBOR_CONTEXT_COMMA cose_errback * perr)
diff --git a/src/configure.h b/src/configure.h
index e4706d4..183ca31 100644
--- a/src/configure.h
+++ b/src/configure.h
@@ -91,3 +91,5 @@
#define USE_OPEN_SSL 1
#define USE_BCRYPT 0
+
+//#define USE_COUNTER_SIGNATURES
diff --git a/src/cose.h b/src/cose.h
index ab4c19c..6d1cecd 100644
--- a/src/cose.h
+++ b/src/cose.h
@@ -11,6 +11,7 @@
typedef struct _cose_recipient * HCOSE_RECIPIENT;
typedef struct _cose_mac * HCOSE_MAC;
typedef struct _cose_mac0 * HCOSE_MAC0;
+typedef struct _cose_counterSignature * HCOSE_COUNTERSIGN;
/**
* All of the different kinds of errors
@@ -138,9 +139,13 @@
typedef enum {
COSE_Header_Algorithm = 1,
+ COSE_Header_Critical = 2,
COSE_Header_Content_Type = 3,
COSE_Header_KID = 4,
COSE_Header_IV = 5,
+ COSE_Header_Partial_IV = 6,
+ COSE_Header_CounterSign = 7,
+ COSE_Header_Operation_Time = 8,
COSE_Header_HKDF_salt = -20,
COSE_Header_KDF_U_nonce = -21,
@@ -197,6 +202,9 @@
extern bool COSE_Enveloped_AddRecipient(HCOSE_ENVELOPED hMac, HCOSE_RECIPIENT hRecip, cose_errback * perr);
HCOSE_RECIPIENT COSE_Enveloped_GetRecipient(HCOSE_ENVELOPED cose, int iRecipient, cose_errback * perr);
+extern bool COSE_Enveloped_AddCounterSigner(HCOSE_ENCRYPT hEnv, HCOSE_COUNTERSIGN hSign, cose_errback * perr);
+HCOSE_COUNTERSIGN COSE_Enveloped_GetCounterSigner(HCOSE_ENCRYPT, int iSigner, cose_errback * perr);
+
/*
*/
@@ -310,6 +318,15 @@
cn_cbor * COSE_Sign0_map_get_int(HCOSE_SIGN0 h, int key, int flags, cose_errback * perror);
bool COSE_Sign0_map_put_int(HCOSE_SIGN0 cose, int key, cn_cbor * value, int flags, cose_errback * errp);
+/*
+ * Counter Signature Routines
+ */
+
+HCOSE_COUNTERSIGN COSE_CounterSign_Init(COSE_INIT_FLAGS flags, CBOR_CONTEXT_COMMA cose_errback * perr);
+bool COSE_CounterSign_Free(HCOSE_COUNTERSIGN cose);
+
+cn_cbor * COSE_CounterSign_map_get_int(HCOSE_COUNTERSIGN h, int key, int flags, cose_errback * perror);
+bool COSE_CounterSign_map_put_int(HCOSE_COUNTERSIGN cose, int key, cn_cbor * value, int flags, cose_errback * errp);
/*
*/
diff --git a/src/cose_int.h b/src/cose_int.h
index 4fc9254..72a2bd5 100644
--- a/src/cose_int.h
+++ b/src/cose_int.h
@@ -3,6 +3,11 @@
// These definitions are here because they aren't required for the public
// interface, and they were quite confusing in cn-cbor.h
+#ifdef USE_COUNTER_SIGNATURES
+struct _COSE_COUNTER_SIGN;
+typedef struct _COSE_COUNTER_SIGN COSE_Counter_Sign;
+#endif
+
typedef struct _COSE {
COSE_INIT_FLAGS m_flags; // Not sure what goes here yet
int m_ownMsg; // Do I own the pointer @ m_cbor?
@@ -20,6 +25,9 @@
cn_cbor_context m_allocContext;
#endif
struct _COSE * m_handleList;
+#ifdef USE_COUNTER_SIGNATURES
+ COSE_Counter_Sign * m_counterSigners;
+#endif
} COSE;
struct _SignerInfo;
@@ -79,6 +87,12 @@
#endif
typedef COSE_MacMessage COSE_Mac0Message;
+#ifdef USE_COUNTER_SIGNATURES
+typedef struct _COSE_COUNTER_SIGN {
+ COSE_SignerInfo m_signer;
+} COSE_CounterSign;
+#endif
+
#ifdef USE_CBOR_CONTEXT
/**
* Allocate enough space for 1 `cn_cbor` structure.
@@ -148,6 +162,7 @@
extern bool IsValidEnvelopedHandle(HCOSE_ENVELOPED h);
extern bool IsValidRecipientHandle(HCOSE_RECIPIENT h);
extern bool IsValidSignerHandle(HCOSE_SIGNER h);
+extern bool IsValidCounterSignHandle(HCOSE_COUNTERSIGN h);
extern bool _COSE_Init(COSE_INIT_FLAGS flags, COSE * pcose, int msgType, CBOR_CONTEXT_COMMA cose_errback * errp);
extern bool _COSE_Init_From_Object(COSE* pobj, cn_cbor * pcbor, CBOR_CONTEXT_COMMA cose_errback * perror);
@@ -183,6 +198,9 @@
extern HCOSE_SIGN _COSE_Sign_Init_From_Object(cn_cbor *, COSE_SignMessage * pIn, CBOR_CONTEXT_COMMA cose_errback * errp);
extern void _COSE_Sign_Release(COSE_SignMessage * p);
+// Signer items
+
+extern bool _COSE_SignerInfo_Init(COSE_INIT_FLAGS flags, COSE_SignerInfo * pcose, int msgType, CBOR_CONTEXT_COMMA cose_errback * errp);
extern bool _COSE_Signer_sign(COSE_SignerInfo * pSigner, const cn_cbor * pcborBody, const cn_cbor * pcborProtected, cose_errback * perr);
extern COSE_SignerInfo * _COSE_SignerInfo_Init_From_Object(cn_cbor * cbor, COSE_SignerInfo * pIn, CBOR_CONTEXT_COMMA cose_errback * perr);
extern bool _COSE_SignerInfo_Free(COSE_SignerInfo * pSigner);
@@ -204,6 +222,11 @@
extern HCOSE_MAC0 _COSE_Mac0_Init_From_Object(cn_cbor *, COSE_Mac0Message * pIn, CBOR_CONTEXT_COMMA cose_errback * errp);
extern bool _COSE_Mac0_Release(COSE_Mac0Message * p);
+// Counter Sign Items
+extern HCOSE_COUNTERSIGN _COSE_CounterSign_get(COSE * pMessage, int iSigner, cose_errback * perr);
+extern bool _COSE_CounterSign_add(COSE * pMessage, HCOSE_COUNTERSIGN hSigner, cose_errback * perr);
+extern bool _COSE_CountSign_create(COSE * pMessage, cn_cbor * pcnBody, CBOR_CONTEXT_COMMA cose_errback * perr);
+
//
// Debugging Items
@@ -250,3 +273,6 @@
enum {
COSE_Int_Alg_AES_CBC_MAC_256_64 = -22
};
+
+
+#define COSE_CounterSign_object 1000
\ No newline at end of file
diff --git a/test/encrypt.c b/test/encrypt.c
index b3b9ff5..541fdec 100644
--- a/test/encrypt.c
+++ b/test/encrypt.c
@@ -20,6 +20,7 @@
{
HCOSE_ENVELOPED hEnc = NULL;
HCOSE_RECIPIENT hRecip = NULL;
+ HCOSE_RECIPIENT hRecip1 = NULL;
HCOSE_RECIPIENT hRecip2 = NULL;
bool fRet = false;
int type;
@@ -34,42 +35,44 @@
if (!SetReceivingAttributes((HCOSE)hEnc, pEnveloped, Attributes_Enveloped_protected)) goto errorReturn;
- hRecip = COSE_Enveloped_GetRecipient(hEnc, iRecipient1, NULL);
- if (hRecip == NULL) goto errorReturn;
- if (!SetReceivingAttributes((HCOSE)hRecip, pRecipient1, Attributes_Recipient_protected)) goto errorReturn;
+ hRecip1 = COSE_Enveloped_GetRecipient(hEnc, iRecipient1, NULL);
+ if (hRecip1 == NULL) goto errorReturn;
+ if (!SetReceivingAttributes((HCOSE)hRecip1, pRecipient1, Attributes_Recipient_protected)) goto errorReturn;
if (pRecipient2 != NULL) {
pkey = BuildKey(cn_cbor_mapget_string(pRecipient2, "key"), false);
if (pkey == NULL) goto errorReturn;
- hRecip2 = COSE_Recipient_GetRecipient(hRecip, iRecipient2, NULL);
+ hRecip2 = COSE_Recipient_GetRecipient(hRecip1, iRecipient2, NULL);
if (hRecip2 == NULL) goto errorReturn;
if (!SetReceivingAttributes((HCOSE)hRecip2, pRecipient2, Attributes_Recipient_protected)) goto errorReturn;
if (!COSE_Recipient_SetKey(hRecip2, pkey, NULL)) goto errorReturn;
- }
- else {
- pkey = BuildKey(cn_cbor_mapget_string(pRecipient1, "key"), false);
- if (pkey == NULL) goto errorReturn;
- if (!COSE_Recipient_SetKey(hRecip, pkey, NULL)) goto errorReturn;
- }
-
- cn_cbor * cnStatic = cn_cbor_mapget_string(pRecipient1, "sender_key");
- if (cnStatic != NULL) {
- if (COSE_Recipient_map_get_int(hRecip, COSE_Header_ECDH_SPK, COSE_BOTH, NULL) == 0) {
- COSE_Recipient_map_put_int(hRecip, COSE_Header_ECDH_SPK, BuildKey(cnStatic, true), COSE_DONT_SEND, NULL);
- }
- }
-
- if (pRecipient2 != NULL) {
- cnStatic = cn_cbor_mapget_string(pRecipient2, "sender_key");
+ cn_cbor * cnStatic = cn_cbor_mapget_string(pRecipient2, "sender_key");
if (cnStatic != NULL) {
if (COSE_Recipient_map_get_int(hRecip2, COSE_Header_ECDH_SPK, COSE_BOTH, NULL) == 0) {
COSE_Recipient_map_put_int(hRecip2, COSE_Header_ECDH_SPK, BuildKey(cnStatic, true), COSE_DONT_SEND, NULL);
}
}
+
+ hRecip = hRecip2;
}
+ else {
+ pkey = BuildKey(cn_cbor_mapget_string(pRecipient1, "key"), false);
+ if (pkey == NULL) goto errorReturn;
+ if (!COSE_Recipient_SetKey(hRecip1, pkey, NULL)) goto errorReturn;
+
+ cn_cbor * cnStatic = cn_cbor_mapget_string(pRecipient1, "sender_key");
+ if (cnStatic != NULL) {
+ if (COSE_Recipient_map_get_int(hRecip1, COSE_Header_ECDH_SPK, COSE_BOTH, NULL) == 0) {
+ COSE_Recipient_map_put_int(hRecip1, COSE_Header_ECDH_SPK, BuildKey(cnStatic, true), COSE_DONT_SEND, NULL);
+ }
+ }
+
+ hRecip = hRecip1;
+ }
+
if (!fFailBody) {
cn_cbor * cn = cn_cbor_mapget_string(pRecipient1, "fail");
@@ -89,7 +92,7 @@
errorReturn:
if (hEnc != NULL) COSE_Enveloped_Free(hEnc);
- if (hRecip != NULL) COSE_Recipient_Free(hRecip);
+ if (hRecip1 != NULL) COSE_Recipient_Free(hRecip1);
if (hRecip2 != NULL) COSE_Recipient_Free(hRecip2);