Testing Cleanup work
diff --git a/README.md b/README.md
index c6a3110..5948a4f 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 
 # COSE-C Implementation [![Build Status](https://travis-ci.org/cose-wg/COSE-C.svg?branch=master)](https://travis-ci.org/cose-wg/COSE-C) [![Coverage Status](https://coveralls.io/repos/cose-wg/COSE-C/badge.svg?branch=master&service=github)](https://coveralls.io/github/cose-wg/COSE-C?branch=master) [![Coverity Status](https://scan.coverity.com/projects/7542/badge.svg)](https://scan.coverity.com/projects/jimsch-cose-c)
 
-This project is a C implementation of the IETF CBOR Encoded Mesage Syntax (COSE).
+This project is a C implementation of the IETF CBOR Encoded Message Syntax (COSE).
 There are currently two versions of the COSE document that can be read.
 The most current work in progress draft can be found on github in the [cose-wg/cose-spec](https://cose-wg.github.io/cose-spec/) project.
 The IETF also keeps a copy of the spec in the [COSE WG](https://tools.ietf.org/html/draft-ietf-cose-msg).
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..d5bc5c6 100644
--- a/src/Encrypt.c
+++ b/src/Encrypt.c
@@ -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;
 				}
 			}
@@ -550,6 +554,11 @@
 	const cn_cbor * cbProtected = _COSE_encode_protected(&pcose->m_message, perr);
 	if (cbProtected == NULL) goto errorReturn;
 
+	//  Setup Counter Signatures
+	if (!_COSE_CountSign_create(&pcose->m_message, CBOR_CONTEXT_PARAM_COMMA perr)) {
+		goto errorReturn;
+	}
+
 	//  Build authenticated data
 
 	size_t cbAuthData = 0;
@@ -848,3 +857,21 @@
 errorReturn:
 	return (HCOSE_RECIPIENT)p;
 }
+
+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;
+}
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..d701386 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..1d4c7f8 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, 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);