cn_cbor * _COSE_map_get_int(COSE * pcose, int key, int flags, cose_errback * perror) { cn_cbor * p = NULL; if (perror != NULL) perror->err = COSE_ERR_NONE; if ((pcose->m_protectedMap != NULL) && ((flags & COSE_PROTECT_ONLY) != 0)) { p = cn_cbor_mapget_int(pcose->m_protectedMap, key); if (p != NULL) return p; } if ((pcose->m_unprotectMap != NULL) && ((flags & COSE_UNPROTECT_ONLY) != 0)) { p = cn_cbor_mapget_int(pcose->m_unprotectMap, key); if (p != NULL) return p; } if ((pcose->m_dontSendMap != NULL) && ((flags & COSE_DONT_SEND) != 0)) { p = cn_cbor_mapget_int(pcose->m_dontSendMap, key); } return p; }
static void data_cb(ls_event_data* evt, void* arg) { tube_event_data* td = evt->data; UNUSED_PARAM(arg); config.numRcvdPkts++; if (td->cbor) { const cn_cbor* data = cn_cbor_mapget_int(td->cbor, 0); ( (char*)data->v.str )[data->length - 1] = '\0'; /* TODO: cheating */ if ( data && ( (data->type == CN_CBOR_TEXT) || (data->type == CN_CBOR_BYTES) ) ) { /* printf("\r " ESC_7C " RX: %i %s", */ /* config.numRcvdPkts, */ /* data->v.str); */ printf(" RX: %i %s\n", config.numRcvdPkts, data->v.str); } } }
bool ECKey_From(const cn_cbor * pKey, mbedtls_ecp_keypair *keypair, cose_errback * perr) { byte rgbKey[MBEDTLS_ECP_MAX_PT_LEN]; int cbKey; int cbGroup; const cn_cbor * p; mbedtls_ecp_group_id groupId; p = cn_cbor_mapget_int(pKey, COSE_Key_Type); CHECK_CONDITION(p != NULL, COSE_ERR_INVALID_PARAMETER); if(p->type == CN_CBOR_UINT) { CHECK_CONDITION(p->v.uint == COSE_Key_Type_EC2, COSE_ERR_INVALID_PARAMETER); } else { FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER); } p = cn_cbor_mapget_int(pKey, COSE_Key_EC_Curve); CHECK_CONDITION((p != NULL) && (p->type == CN_CBOR_UINT), COSE_ERR_INVALID_PARAMETER); switch (p->v.uint) { case 1: // P-256 groupId = MBEDTLS_ECP_DP_SECP256R1; break; case 2: // P-384 groupId = MBEDTLS_ECP_DP_SECP384R1; break; case 3: // P-521 groupId = MBEDTLS_ECP_DP_SECP521R1; break; default: FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER); } CHECK_CONDITION(mbedtls_ecp_group_load(&keypair->grp, groupId) == 0, COSE_ERR_INVALID_PARAMETER); cbGroup = (keypair->grp.nbits + 7) / 8; p = cn_cbor_mapget_int(pKey, COSE_Key_EC_X); CHECK_CONDITION((p != NULL) && (p->type == CN_CBOR_BYTES), COSE_ERR_INVALID_PARAMETER); CHECK_CONDITION(p->length == cbGroup, COSE_ERR_INVALID_PARAMETER); memcpy(rgbKey+1, p->v.str, p->length); p = cn_cbor_mapget_int(pKey, COSE_Key_EC_Y); CHECK_CONDITION((p != NULL), COSE_ERR_INVALID_PARAMETER); if (p->type == CN_CBOR_BYTES) { rgbKey[0] = 0x04; cbKey = cbGroup * 2 + 1; CHECK_CONDITION(p->length == cbGroup, COSE_ERR_INVALID_PARAMETER); memcpy(rgbKey + p->length + 1, p->v.str, p->length); } else if (p->type == CN_CBOR_TRUE) { cbKey = cbGroup + 1; rgbKey[0] = 0x03; } else if (p->type == CN_CBOR_FALSE) { cbKey = cbGroup + 1; rgbKey[0] = 0x02; } else FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER); CHECK_CONDITION(mbedtls_ecp_point_read_binary(&keypair->grp, &keypair->Q, rgbKey, cbKey) == 0, COSE_ERR_INVALID_PARAMETER); p = cn_cbor_mapget_int(pKey, COSE_Key_EC_d); if (p != NULL) { CHECK_CONDITION(p->type == CN_CBOR_BYTES, COSE_ERR_INVALID_PARAMETER); CHECK_CONDITION(mbedtls_mpi_read_binary( &keypair->d, p->v.bytes, p->length) == 0, COSE_ERR_CRYPTO_FAIL); } return true; errorReturn: return false; }
EC_KEY * ECKey_From(const cn_cbor * pKey, int * cbGroup, cose_errback * perr) { EC_KEY * pNewKey = EC_KEY_new(); byte rgbKey[512+1]; const cn_cbor * p; int nidGroup = -1; EC_POINT * pPoint = NULL; p = cn_cbor_mapget_int(pKey, COSE_Key_EC_Curve); CHECK_CONDITION(p != NULL, COSE_ERR_INVALID_PARAMETER); switch (p->v.sint) { case 1: // P-256 nidGroup = NID_X9_62_prime256v1; *cbGroup = 256 / 8; break; case 2: // P-384 nidGroup = NID_secp384r1; *cbGroup = 384 / 8; break; case 3: // P-521 nidGroup = NID_secp521r1; *cbGroup = (521 + 7) / 8; break; default: FAIL_CONDITION(COSE_ERR_INVALID_PARAMETER); } EC_GROUP * ecgroup = EC_GROUP_new_by_curve_name(nidGroup); EC_KEY_set_group(pNewKey, ecgroup); rgbKey[0] = POINT_CONVERSION_UNCOMPRESSED; p = cn_cbor_mapget_int(pKey, COSE_Key_EC_X); if (p == NULL) return NULL; if (p->type != CN_CBOR_BYTES) return NULL; memcpy(rgbKey+1, p->v.str, p->length); p = cn_cbor_mapget_int(pKey, COSE_Key_EC_Y); if (p == NULL) return NULL; if (p->type != CN_CBOR_BYTES) return NULL; memcpy(rgbKey + p->length+1, p->v.str, p->length); pPoint = EC_POINT_new(ecgroup); EC_POINT_oct2point(ecgroup, pPoint, rgbKey, p->length * 2 + 1, NULL); EC_KEY_set_public_key(pNewKey, pPoint); p = cn_cbor_mapget_int(pKey, COSE_Key_EC_d); if (p != NULL) { BIGNUM * pbn; pbn = BN_bin2bn(p->v.bytes, (int) p->length, NULL); EC_KEY_set_private_key(pNewKey, pbn); } return pNewKey; errorReturn: return NULL; }