diff --git a/dumper/dumper.c b/dumper/dumper.c
index 23feca1..fea6500 100644
--- a/dumper/dumper.c
+++ b/dumper/dumper.c
@@ -237,8 +237,9 @@
 {
 	int i;
 
-	for (i = 0; i < depth; i++)
+	for (i = 0; i < depth; i++) {
 		WrapPrintF(fp, "  ");
+	}
 }
 
 void PrintUsage()
@@ -254,8 +255,9 @@
 
 	for (i = 0; i < cbor->length; i++) {
 		if ((cbor->v.bytes[i] < 32) || (cbor->v.bytes[i] > 126) ||
-			(cbor->v.bytes[i] == '\''))
+			(cbor->v.bytes[i] == '\'')) {
 			fText = false;
+		}
 	}
 
 	if (fText && (cbor->length > 0)) {
@@ -290,8 +292,9 @@
 	if (pFOO != NULL) {
 		switch (pFOO->type) {
 			case CN_CBOR_TAG:
-				if (cbor->type != CN_CBOR_TAG)
+				if (cbor->type != CN_CBOR_TAG) {
 					pFOO = NULL;
+				}
 				break;
 			default:
 				break;
@@ -299,10 +302,12 @@
 	}
 
 	if (fField && (pFOO != NULL) && (pFOO->fieldName != NULL)) {
-		if (fInComment)
+		if (fInComment) {
 			WrapPrintF(out, "\\ %s \\ ", pFOO->fieldName);
-		else
+		}
+		else {
 			WrapPrintF(out, "/ %s / ", pFOO->fieldName);
+		}
 	}
 
 	switch (cbor->type) {
@@ -321,16 +326,21 @@
 			WrapPrintF(out, "[");
 			cbor2 = cbor->first_child;
 			for (i = 0; i < cbor->length; i++, cbor2 = cbor2->next) {
-				if (i != 0)
+				if (i != 0) {
 					WrapPrintF(out, ", ");
-				if (pFOO == NULL)
+				}
+				if (pFOO == NULL) {
 					pFoo2 = NULL;
-				else if (pFOO->count == 1)
+				}
+				else if (pFOO->count == 1) {
 					pFoo2 = pFOO->children;
-				else if (i >= pFOO->count)
+				}
+				else if (i >= pFOO->count) {
 					pFoo2 = NULL;
-				else
+				}
+				else {
 					pFoo2 = &pFOO->children[i];
+				}
 
 				WrapPrintF(out, "\n");
 				Indent(out, depth + 1);
@@ -364,23 +374,28 @@
 					//  Locate the right entry in foo
 					for (i2 = 0, pFoo2 = pFOO->children; i2 < pFOO->count;
 						 pFoo2++, i2 += 1) {
-						if ((unsigned)pFoo2->type != cbor2->type)
+						if ((unsigned)pFoo2->type != cbor2->type) {
 							continue;
+						}
 						switch (cbor2->type) {
 							case CN_CBOR_UINT:
 								if ((group != 0) && (pFoo2->group != 0) &&
-									(pFoo2->group != group))
+									(pFoo2->group != group)) {
 									continue;
-								if (pFoo2->value == (int)cbor2->v.uint)
+								}
+								if (pFoo2->value == (int)cbor2->v.uint) {
 									i2 = pFOO->count + 1;
+								}
 								break;
 
 							case CN_CBOR_INT:
 								if ((group != 0) && (pFoo2->group != 0) &&
-									(pFoo2->group != group))
+									(pFoo2->group != group)) {
 									continue;
-								if (pFoo2->value == cbor2->v.sint)
+								}
+								if (pFoo2->value == cbor2->v.sint) {
 									i2 = pFOO->count + 1;
+								}
 								break;
 
 							default:
@@ -388,14 +403,17 @@
 								break;
 						}
 
-						if (i2 == pFOO->count + 1)
+						if (i2 == pFOO->count + 1) {
 							break;
+						}
 					}
-					if (i2 == pFOO->count)
+					if (i2 == pFOO->count) {
 						pFoo2 = NULL;
+					}
 				}
-				if (i != 0)
+				if (i != 0) {
 					WrapPrintF(out, ", ");
+				}
 				WrapPrintF(out, "\n");
 				Indent(out, depth + 1);
 				DumpTree(cbor2, out, pFoo2, depth + 1, true, false, fInComment);
@@ -432,10 +450,12 @@
 					if ((pFoo2->type == CN_CBOR_INT) &&
 						(pFoo2->value == cbor->v.sint)) {
 						if (pFoo2->fieldName != NULL) {
-							if (fInComment)
+							if (fInComment) {
 								WrapPrintF(out, " \\ %s \\", pFoo2->fieldName);
-							else
+							}
+							else {
 								WrapPrintF(out, " / %s /", pFoo2->fieldName);
+							}
 						}
 						break;
 					}
@@ -451,10 +471,12 @@
 					if ((pFoo2->type == CN_CBOR_UINT) &&
 						(pFoo2->value == (int)cbor->v.uint)) {
 						if (pFoo2->fieldName != NULL) {
-							if (fInComment)
+							if (fInComment) {
 								WrapPrintF(out, " \\ %s \\", pFoo2->fieldName);
-							else
+							}
+							else {
 								WrapPrintF(out, " / %s /", pFoo2->fieldName);
+							}
 						}
 						break;
 					}
@@ -504,27 +526,36 @@
 			if (strcmp(&argv[i][1], "someoption") == 0) {
 			} else if (strcmp(&argv[i][1], "xml=yes") == 0) {
 				forXML = true;
-			} else if (strcmp(&argv[i][1], "xml=no") == 0)
+			} else if (strcmp(&argv[i][1], "xml=no") == 0) {
 				forXML = false;
+			}
 			else if (strncmp(&argv[i][1], "wrap=", 5) == 0) {
 				WrapLineAt = atoi(&argv[i][6]);
 			} else if (strncmp(&argv[i][1], "type=", 5) == 0) {
-				if (strcmp(&argv[i][1], "type=encrypt") == 0)
+				if (strcmp(&argv[i][1], "type=encrypt") == 0) {
 					root = &EncryptedMessage;
-				else if (strcmp(&argv[i][1], "type=envelope") == 0)
+				}
+				else if (strcmp(&argv[i][1], "type=envelope") == 0) {
 					root = &EnvelopedMessage;
-				else if (strcmp(&argv[i][1], "type=signed") == 0)
+				}
+				else if (strcmp(&argv[i][1], "type=signed") == 0) {
 					root = &SignedMessage;
-				else if (strcmp(&argv[i][1], "type=mac") == 0)
+				}
+				else if (strcmp(&argv[i][1], "type=mac") == 0) {
 					root = &MacMessage;
-				else if (strcmp(&argv[i][1], "type=mac0") == 0)
+				}
+				else if (strcmp(&argv[i][1], "type=mac0") == 0) {
 					root = &Mac0Message;
-				else if (strcmp(&argv[i][1], "type=keyset") == 0)
+				}
+				else if (strcmp(&argv[i][1], "type=keyset") == 0) {
 					root = &KeySet;
-				else if (strcmp(&argv[i][1], "type=key") == 0)
+				}
+				else if (strcmp(&argv[i][1], "type=key") == 0) {
 					root = &Key;
-				else
+				}
+				else {
 					PrintUsage();
+				}
 			} else {
 				PrintUsage();
 				exit(1);
@@ -560,8 +591,9 @@
 					 //  OPEN_O_BINARY);
 #endif
 	}
-	if (out == NULL)
+	if (out == NULL) {
 		out = stdout;
+	}
 
 	// Read the input to a buffer - needed for the parser
 
diff --git a/include/cose/cose_configure.h.in b/include/cose/cose_configure.h.in
index 718b57f..3f97ffd 100644
--- a/include/cose/cose_configure.h.in
+++ b/include/cose/cose_configure.h.in
@@ -24,6 +24,10 @@
 #include <openssl/opensslv.h>
 #endif
 
+#if defined(COSE_C_USE_MBEDTLS)
+#include <mbedtls/config.h>
+#endif
+
 //
 //  Define which AES GCM algorithms are being used
 //
@@ -82,7 +86,6 @@
 //  Define which ECDH algorithms are to be used
 //
 
-#if !defined(COSE_C_USE_MBEDTLS)
 #define USE_ECDH_ES_HKDF_256
 #define USE_ECDH_ES_HKDF_512
 #define USE_ECDH_SS_HKDF_256
@@ -92,9 +95,8 @@
 #define USE_ECDH 1
 #define USE_HKDF_SHA2 1
 #endif
-#endif  // !defined(COSE_C_USE_MBEDTLS)
 
-#if !defined(COSE_C_USE_MBEDTLS)
+#if !defined(COSE_C_USE_MBEDTLS) || defined(MBEDTLS_NIST_KW_C)
 #define USE_ECDH_ES_A128KW
 #define USE_ECDH_ES_A192KW
 #define USE_ECDH_ES_A256KW
@@ -113,7 +115,7 @@
 //  Define which Key Wrap functions are to be used
 //
 
-#if !defined(COSE_C_USE_MBEDTLS)
+#if !defined(COSE_C_USE_MBEDTLS) || defined(MBEDTLS_NIST_KW_C)
 #define USE_AES_KW_128
 #define USE_AES_KW_192
 #define USE_AES_KW_256
@@ -123,15 +125,15 @@
 //  Define which of the DIRECT + KDF algorithms are to be used
 //
 
-#if !defined(COSE_C_USE_MBEDTLS)
 #define USE_Direct_HKDF_HMAC_SHA_256
 #define USE_Direct_HKDF_HMAC_SHA_512
-#define USE_Direct_HKDF_AES_128
-#define USE_Direct_HKDF_AES_256
 #if defined(USE_Direct_HKDF_HMAC_SHA_256) || \
 	defined(USE_Direct_HKDF_HMAC_SHA_512)
 #define USE_HKDF_SHA2 1
 #endif
+#if !defined(COSE_C_USE_MBEDTLS)
+#define USE_Direct_HKDF_AES_128
+#define USE_Direct_HKDF_AES_256
 #if defined(USE_Direct_HKDF_AES_128) || defined(USE_Direct_KDF_AES_256)
 #define USE_HKDF_AES 1
 #endif
diff --git a/src/mbedtls.c b/src/mbedtls.c
index 8577dec..6727c14 100644
--- a/src/mbedtls.c
+++ b/src/mbedtls.c
@@ -20,11 +20,13 @@
 #include "mbedtls/ecp.h"
 #include "mbedtls/ecdh.h"
 #include "mbedtls/nist_kw.h"
+#include "mbedtls/hkdf.h"
 
 static bool FUseCompressed = true;
 
 #define MIN(A, B) ((A) < (B) ? (A) : (B))
 
+#ifdef INCLUDE_AES_CCM
 bool AES_CCM_Decrypt(COSE_Enveloped *pcose,
 	int TSize,
 	int LSize,
@@ -52,12 +54,14 @@
 	//  Setup the IV/Nonce and put it into the message
 	pIV = _COSE_map_get_int(&pcose->m_message, COSE_Header_IV, COSE_BOTH, NULL);
 	if ((pIV == NULL) || (pIV->type != CN_CBOR_BYTES)) {
-		if (perr != NULL)
+		if (perr != NULL) {
 			perr->err = COSE_ERR_INVALID_PARAMETER;
+		}
 
 	errorReturn:
-		if (rgbOut != NULL)
+		if (rgbOut != NULL) {
 			COSE_FREE(rgbOut, context);
+		}
 		mbedtls_ccm_free(&ctx);
 		return false;
 	}
@@ -129,8 +133,9 @@
 		pbIV = NULL;
 
 		if (!_COSE_map_put(&pcose->m_message, COSE_Header_IV, cbor_iv_t,
-				COSE_UNPROTECT_ONLY, perr))
+				COSE_UNPROTECT_ONLY, perr)) {
 			goto errorReturn;
+		}
 		cbor_iv_t = NULL;
 	}
 	else {
@@ -172,18 +177,25 @@
 	return true;
 
 errorReturn:
-	if (pbIV != NULL)
+	if (pbIV != NULL) {
 		COSE_FREE(pbIV, context);
-	if (cbor_iv_t != NULL)
+	}
+	if (cbor_iv_t != NULL) {
 		COSE_FREE(cbor_iv_t, context);
-	if (rgbOut != NULL)
+	}
+	if (rgbOut != NULL) {
 		COSE_FREE(rgbOut, context);
-	if (cnTmp != NULL)
+	}
+	if (cnTmp != NULL) {
 		COSE_FREE(cnTmp, context);
+	}
 	mbedtls_ccm_free(&ctx);
 	return false;
 }
+#endif
 
+
+#ifdef USE_AES_GCM
 bool AES_GCM_Decrypt(COSE_Enveloped *pcose,
 	const byte *pbKey,
 	size_t cbKey,
@@ -210,12 +222,14 @@
 
 	pIV = _COSE_map_get_int(&pcose->m_message, COSE_Header_IV, COSE_BOTH, NULL);
 	if ((pIV == NULL) || (pIV->type != CN_CBOR_BYTES)) {
-		if (perr != NULL)
+		if (perr != NULL) {
 			perr->err = COSE_ERR_INVALID_PARAMETER;
+		}
 
 	errorReturn:
-		if (rgbOut != NULL)
+		if (rgbOut != NULL) {
 			COSE_FREE(rgbOut, context);
+		}
 		mbedtls_gcm_free(&ctx);
 		return false;
 	}
@@ -258,9 +272,10 @@
 
 	//  CHECK TAG HERE
 	bool f = false;
-	byte *pb = pbCrypto + cbOut;
-	for (int i = 0; i < (unsigned int)TSize; i++)
+	const byte *pb = pbCrypto + cbOut;
+	for (int i = 0; i < (unsigned int)TSize; i++) {
 		f |= (pb[i] != tag[i]);
+	}
 	CHECK_CONDITION(!f, COSE_ERR_CRYPTO_FAIL);
 
 	mbedtls_gcm_free(&ctx);
@@ -307,8 +322,9 @@
 		pbIV = NULL;
 
 		if (!_COSE_map_put(&pcose->m_message, COSE_Header_IV, cbor_iv_t,
-				COSE_UNPROTECT_ONLY, perr))
+				COSE_UNPROTECT_ONLY, perr)) {
 			goto errorReturn;
+		}
 		cbor_iv_t = NULL;
 	}
 	else {
@@ -362,140 +378,22 @@
 	return true;
 
 errorReturn:
-	if (pbIV != NULL)
+	if (pbIV != NULL) {
 		COSE_FREE(pbIV, context);
-	if (cbor_iv_t != NULL)
+	}
+	if (cbor_iv_t != NULL) {
 		COSE_FREE(cbor_iv_t, context);
-	if (rgbOut != NULL)
+	}
+	if (rgbOut != NULL) {
 		COSE_FREE(rgbOut, context);
+	}
 	mbedtls_gcm_free(&ctx);
 	return false;
 }
-/*
 
-bool AES_CBC_MAC_Create(COSE_MacMessage * pcose, int TSize, const byte * pbKey,
-size_t cbKey, const byte * pbAuthData, size_t cbAuthData, cose_errback * perr)
-{
-	const EVP_CIPHER * pcipher = NULL;
-	EVP_CIPHER_CTX ctx;
-	int cbOut;
-	byte rgbIV[16] = { 0 };
-	byte * rgbOut = NULL;
-	bool f = false;
-	unsigned int i;
-	cn_cbor * cn = NULL;
-#ifdef USE_CBOR_CONTEXT
-	cn_cbor_context * context = &pcose->m_message.m_allocContext;
 #endif
 
-	EVP_CIPHER_CTX_init(&ctx);
 
-	rgbOut = COSE_CALLOC(16, 1, context);
-	CHECK_CONDITION(rgbOut != NULL, COSE_ERR_OUT_OF_MEMORY);
-
-	switch (cbKey*8) {
-	case 128:
-		pcipher = EVP_aes_128_cbc();
-		break;
-
-	case 256:
-		pcipher = EVP_aes_256_cbc();
-		break;
-
-	default:
-		FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
-	}
-
-	//  Setup and run the OpenSSL code
-
-	CHECK_CONDITION(EVP_EncryptInit_ex(&ctx, pcipher, NULL, pbKey, rgbIV),
-COSE_ERR_CRYPTO_FAIL);
-
-	for (i = 0; i < (unsigned int)cbAuthData / 16; i++) {
-		CHECK_CONDITION(EVP_EncryptUpdate(&ctx, rgbOut, &cbOut, pbAuthData + (i
-* 16), 16), COSE_ERR_CRYPTO_FAIL);
-	}
-	if (cbAuthData % 16 != 0) {
-		CHECK_CONDITION(EVP_EncryptUpdate(&ctx, rgbOut, &cbOut, pbAuthData + (i
-* 16), cbAuthData % 16), COSE_ERR_CRYPTO_FAIL);
-		CHECK_CONDITION(EVP_EncryptUpdate(&ctx, rgbOut, &cbOut, rgbIV, 16 -
-(cbAuthData % 16)), COSE_ERR_CRYPTO_FAIL);
-	}
-
-	cn = cn_cbor_data_create(rgbOut, TSize / 8, CBOR_CONTEXT_PARAM_COMMA NULL);
-	CHECK_CONDITION(cn != NULL, COSE_ERR_OUT_OF_MEMORY);
-	rgbOut = NULL;
-
-	CHECK_CONDITION(_COSE_array_replace(&pcose->m_message, cn, INDEX_MAC_TAG,
-CBOR_CONTEXT_PARAM_COMMA NULL), COSE_ERR_CBOR); cn = NULL;
-
-	EVP_CIPHER_CTX_cleanup(&ctx);
-	return !f;
-
-errorReturn:
-	if (rgbOut != NULL) COSE_FREE(rgbOut, context);
-	if (cn != NULL) CN_CBOR_FREE(cn, context);
-	EVP_CIPHER_CTX_cleanup(&ctx);
-	return false;
-}
-
-bool AES_CBC_MAC_Validate(COSE_MacMessage * pcose, int TSize, const byte *
-pbKey, size_t cbKey, const byte * pbAuthData, size_t cbAuthData, cose_errback *
-perr)
-{
-	const EVP_CIPHER * pcipher = NULL;
-	EVP_CIPHER_CTX ctx;
-	int cbOut;
-	byte rgbIV[16] = { 0 };
-	byte rgbTag[16] = { 0 };
-	bool f = false;
-	unsigned int i;
-
-	switch (cbKey*8) {
-	case 128:
-		pcipher = EVP_aes_128_cbc();
-		break;
-
-	case 256:
-		pcipher = EVP_aes_256_cbc();
-		break;
-
-	default:
-		FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
-	}
-
-	//  Setup and run the OpenSSL code
-
-	EVP_CIPHER_CTX_init(&ctx);
-	CHECK_CONDITION(EVP_EncryptInit_ex(&ctx, pcipher, NULL, pbKey, rgbIV),
-COSE_ERR_CRYPTO_FAIL);
-
-	TSize /= 8;
-
-	for (i = 0; i < (unsigned int) cbAuthData / 16; i++) {
-		CHECK_CONDITION(EVP_EncryptUpdate(&ctx, rgbTag, &cbOut,
-pbAuthData+(i*16), 16), COSE_ERR_CRYPTO_FAIL);
-	}
-	if (cbAuthData % 16 != 0) {
-		CHECK_CONDITION(EVP_EncryptUpdate(&ctx, rgbTag, &cbOut, pbAuthData + (i
-* 16), cbAuthData % 16), COSE_ERR_CRYPTO_FAIL);
-		CHECK_CONDITION(EVP_EncryptUpdate(&ctx, rgbTag, &cbOut, rgbIV, 16 -
-(cbAuthData % 16)), COSE_ERR_CRYPTO_FAIL);
-	}
-
-	cn_cbor * cn = _COSE_arrayget_int(&pcose->m_message, INDEX_MAC_TAG);
-	CHECK_CONDITION(cn != NULL, COSE_ERR_CBOR);
-
-	for (i = 0; i < (unsigned int)TSize; i++) f |= (cn->v.bytes[i] !=
-rgbTag[i]);
-
-	EVP_CIPHER_CTX_cleanup(&ctx);
-	return !f;
-
-errorReturn:
-	EVP_CIPHER_CTX_cleanup(&ctx);
-	return false;
-}
 
 #if 0
 //  We are doing CBC-MAC not CMAC at this time
@@ -549,6 +447,7 @@
 }
 #endif
 
+#ifdef USE_HKDF_AES
 bool HKDF_AES_Expand(COSE * pcose, size_t cbitKey, const byte * pbPRK, size_t
 cbPRK, const byte * pbInfo, size_t cbInfo, byte * pbOutput, size_t cbOutput,
 cose_errback * perr)
@@ -610,8 +509,9 @@
 	EVP_CIPHER_CTX_cleanup(&ctx);
 	return false;
 }
-*/
+#endif
 
+#if defined(USE_HKDF_SHA2)
 bool HKDF_Extract(COSE *pcose,
 	const byte *pbKey,
 	size_t cbKey,
@@ -722,52 +622,10 @@
 
 	return true;
 }
-/*
-void dump_output(byte* b, size_t s){
-	for(int i = 0; i < s; i++){
-		printf("%02x", *b);
-		b++;
-	}
-	printf("\n");
-}
+#endif
 
-void diff(unsigned char* a, size_t a_l, unsigned char* b, size_t b_l){
-	size_t s;
-	s = (a_l < b_l) ? a_l : b_l;
-	unsigned char* tmp = a;
-	printf("size = %d\n",s );
-//	printf("%02x\n", *tmp);
-	int i;
-	for(i = 0; i < s; ++i){
-		printf("%02x", *tmp);
-		tmp++;
-	}
-	printf("\n");
 
-	tmp = b;
-	for(i = 0; i < s; ++i){
-		printf("%02x", *tmp);
-		tmp++;
-	}
-	printf("\n");
-
-	for(i = 0; i < s; ++i){
-
-		if(*a != *b){
-			printf("^^");
-
-		} else {
-			printf("__");
-
-		}
-
-		a++;
-		b++;
-	}
-	printf("\n");
-}
-*/
-
+#ifdef USE_HMAC
 bool HMAC_Create(COSE_MacMessage *pcose,
 	int HSize,
 	int TSize,
@@ -887,10 +745,12 @@
 	cn_cbor *cn = _COSE_arrayget_int(&pcose->m_message, INDEX_MAC_TAG);
 	CHECK_CONDITION(cn != NULL, COSE_ERR_CBOR);
 
-	if (cn->length > (int)cbOut)
+	if (cn->length > (int)cbOut) {
 		return false;
-	for (i = 0; i < (unsigned int)TSize / 8; i++)
+	}
+	for (i = 0; i < (unsigned int)TSize / 8; i++) {
 		f |= (cn->v.bytes[i] != rgbOut[i]);
+	}
 
 	mbedtls_md_free(&contx);
 	return !f;
@@ -900,6 +760,7 @@
 	mbedtls_md_free(&contx);
 	return false;
 }
+#endif
 
 #define COSE_Key_EC_Curve -1
 #define COSE_Key_EC_X -2
@@ -992,94 +853,6 @@
 	return false;
 }
 
-/*
-cn_cbor * EC_FromKey(const EC_KEY * pKey, CBOR_CONTEXT_COMMA cose_errback *
-perr)
-{
-	cn_cbor * pkey = NULL;
-	const EC_GROUP * pgroup;
-	int cose_group;
-	cn_cbor * p = NULL;
-	cn_cbor_errback cbor_error;
-	const EC_POINT * pPoint;
-	size_t cbSize;
-	byte * pbOut = NULL;
-
-	pgroup = EC_KEY_get0_group(pKey);
-	CHECK_CONDITION(pgroup != NULL, COSE_ERR_INVALID_PARAMETER);
-
-	switch (EC_GROUP_get_curve_name(pgroup)) {
-	case NID_X9_62_prime256v1:		cose_group = 1;		break;
-	case NID_secp384r1: cose_group = 2; break;
-	case NID_secp521r1: cose_group = 3; break;
-
-	default:
-		FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER);
-	}
-
-	pkey = cn_cbor_map_create(CBOR_CONTEXT_PARAM_COMMA &cbor_error);
-	CHECK_CONDITION_CBOR(pkey != NULL, cbor_error);
-
-	p = cn_cbor_int_create(cose_group, CBOR_CONTEXT_PARAM_COMMA &cbor_error);
-	CHECK_CONDITION_CBOR(p != NULL, cbor_error);
-	CHECK_CONDITION_CBOR(cn_cbor_mapput_int(pkey, COSE_Key_EC_Curve, p,
-CBOR_CONTEXT_PARAM_COMMA &cbor_error), cbor_error); p = NULL;
-
-	pPoint = EC_KEY_get0_public_key(pKey);
-	CHECK_CONDITION(pPoint != NULL, COSE_ERR_INVALID_PARAMETER);
-
-	if (FUseCompressed) {
-		cbSize = EC_POINT_point2oct(pgroup, pPoint, POINT_CONVERSION_COMPRESSED,
-NULL, 0, NULL); CHECK_CONDITION(cbSize > 0, COSE_ERR_CRYPTO_FAIL); pbOut =
-COSE_CALLOC(cbSize, 1, context); CHECK_CONDITION(pbOut != NULL,
-COSE_ERR_OUT_OF_MEMORY); CHECK_CONDITION(EC_POINT_point2oct(pgroup, pPoint,
-POINT_CONVERSION_COMPRESSED, pbOut, cbSize, NULL) == cbSize,
-COSE_ERR_CRYPTO_FAIL);
-	}
-	else {
-		cbSize = EC_POINT_point2oct(pgroup, pPoint,
-POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); CHECK_CONDITION(cbSize > 0,
-COSE_ERR_CRYPTO_FAIL); pbOut = COSE_CALLOC(cbSize, 1, context);
-		CHECK_CONDITION(pbOut != NULL, COSE_ERR_OUT_OF_MEMORY);
-		CHECK_CONDITION(EC_POINT_point2oct(pgroup, pPoint,
-POINT_CONVERSION_UNCOMPRESSED, pbOut, cbSize, NULL) == cbSize,
-COSE_ERR_CRYPTO_FAIL);
-	}
-	p = cn_cbor_data_create(pbOut+1, (int) (cbSize / 2),
-CBOR_CONTEXT_PARAM_COMMA &cbor_error); CHECK_CONDITION_CBOR(p != NULL,
-cbor_error); CHECK_CONDITION_CBOR(cn_cbor_mapput_int(pkey, COSE_Key_EC_X, p,
-CBOR_CONTEXT_PARAM_COMMA &cbor_error), cbor_error); p = NULL;
-
-	if (FUseCompressed) {
-		p = cn_cbor_bool_create(pbOut[0] & 1, CBOR_CONTEXT_PARAM_COMMA
-&cbor_error); CHECK_CONDITION_CBOR(p != NULL, cbor_error);
-		CHECK_CONDITION_CBOR(cn_cbor_mapput_int(pkey, COSE_Key_EC_Y, p,
-CBOR_CONTEXT_PARAM_COMMA &cbor_error), cbor_error); p = NULL;
-	}
-	else {
-		p = cn_cbor_data_create(pbOut + cbSize / 2 + 1, (int)(cbSize / 2),
-CBOR_CONTEXT_PARAM_COMMA &cbor_error); pbOut = NULL;   // It is already part of
-the other one. CHECK_CONDITION_CBOR(p != NULL, cbor_error);
-		CHECK_CONDITION_CBOR(cn_cbor_mapput_int(pkey, COSE_Key_EC_Y, p,
-CBOR_CONTEXT_PARAM_COMMA &cbor_error), cbor_error); p = NULL;
-	}
-
-	p = cn_cbor_int_create(COSE_Key_Type_EC2, CBOR_CONTEXT_PARAM_COMMA
-&cbor_error); CHECK_CONDITION_CBOR(p != NULL, cbor_error);
-	CHECK_CONDITION_CBOR(cn_cbor_mapput_int(pkey, COSE_Key_Type, p,
-CBOR_CONTEXT_PARAM_COMMA &cbor_error), cbor_error); p = NULL;
-
-returnHere:
-	if (pbOut != NULL) COSE_FREE(pbOut, context);
-	if (p != NULL) CN_CBOR_FREE(p, context);
-	return pkey;
-
-errorReturn:
-	CN_CBOR_FREE(pkey, context);
-	pkey = NULL;
-	goto returnHere;
-}
-*/
 
 bool ECDSA_Sign(COSE *pSigner,
 	int index,
@@ -1109,8 +882,9 @@
 	mbedtls_mpi_init(&r);
 	mbedtls_mpi_init(&s);
 
-	if (!ECKey_From(pKey, &keypair, perr))
+	if (!ECKey_From(pKey, &keypair, perr)) {
 		goto errorReturn;
+	}
 
 	CHECK_CONDITION(keypair.d.n != 0, COSE_ERR_INVALID_PARAMETER);
 
@@ -1194,8 +968,9 @@
 	mbedtls_mpi_init(&r);
 	mbedtls_mpi_init(&s);
 
-	if (!ECKey_From(pKey, &keypair, perr))
+	if (!ECKey_From(pKey, &keypair, perr)) {
 		goto errorReturn;
+	}
 
 	switch (cbitDigest) {
 		case 256:
@@ -1242,7 +1017,7 @@
 	return result;
 }
 
-#ifdef MBEDTLS_NIST_KW_C
+#if defined(MBEDTLS_NIST_KW_C)
 bool AES_KW_Decrypt(COSE_Enveloped *pcose,
 	const byte *pbKeyIn,
 	size_t cbitKey,
@@ -1320,7 +1095,7 @@
 	mbedtls_nist_kw_free(&ctx);
 	return false;
 }
-#endif	// MBEDTLS_NIST_KW_C
+#endif
 
 /*
 //#include <stdio.h> //TODO
@@ -1372,7 +1147,7 @@
  }
 */
 
-mbedtls_ctr_drbg_context ctx;
+mbedtls_ctr_drbg_context ctxRandom;
 int ctx_setup = 0;
 mbedtls_entropy_context entropy;
 
@@ -1383,9 +1158,9 @@
 	if (!ctx_setup) {
 		mbedtls_entropy_init(&entropy);
 
-		mbedtls_ctr_drbg_init(&ctx);
+		mbedtls_ctr_drbg_init(&ctxRandom);
 
-		mbedtls_ctr_drbg_seed_entropy_len(&ctx, mbedtls_entropy_func,
+		mbedtls_ctr_drbg_seed_entropy_len(&ctxRandom, mbedtls_entropy_func,
 			(void *)&entropy, nonce_pers_pr, 16, 32);
 
 		ctx_setup = 1;
@@ -1394,7 +1169,7 @@
 	// mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON
 	// );
 
-	mbedtls_ctr_drbg_random(&ctx, pb, cb);
+	mbedtls_ctr_drbg_random(&ctxRandom, pb, cb);
 	// mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE );
 	// memcmp( buf, result_pr, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );
 
