blob: 174d181dfb06c33c6479ed00102d6f114c56d79d [file] [log] [blame]
#include <stdlib.h>
#ifndef __MBED__
#include <memory.h>
#endif
#include "cose/cose.h"
#include "cose_int.h"
#include "cose/cose_configure.h"
#include "cose_crypto.h"
#if USE_COUNTER_SIGNATURE1
extern bool IsValidCounterSign1Handle(HCOSE_COUNTERSIGN1 h);
bool _COSE_CounterSign1_add(COSE* pMessage,
HCOSE_COUNTERSIGN1 hSigner,
cose_errback* perr)
{
COSE_CounterSign1* pSigner = (COSE_CounterSign1*)hSigner;
CHECK_CONDITION(
IsValidCounterSign1Handle(hSigner), COSE_ERR_INVALID_HANDLE);
pMessage->m_counterSign1 = pSigner;
return true;
errorReturn:
return false;
}
HCOSE_COUNTERSIGN _COSE_CounterSign1_get(COSE* pMessage, cose_errback* perr)
{
UNUSED(perr);
COSE_CounterSign1* pSigner = pMessage->m_counterSign1;
return (HCOSE_COUNTERSIGN)pSigner;
}
bool _COSE_CountSign_create(COSE* pMessage,
cn_cbor* pcnBody,
CBOR_CONTEXT_COMMA cose_errback* perr)
{
cn_cbor* pArray = nullptr;
cn_cbor_errback cbor_err;
COSE_CounterSign1* pSigner = nullptr;
cn_cbor* pcnProtected = nullptr;
cn_cbor* pcn = nullptr;
cn_cbor* pcn2 = nullptr;
if (pMessage->m_counterSigners == nullptr)
return true;
// One or more than one?
if (pMessage->m_counterSigners->m_signer.m_signerNext != nullptr) {
pArray = cn_cbor_array_create(CBOR_CONTEXT_PARAM_COMMA & cbor_err);
CHECK_CONDITION_CBOR(pArray != nullptr, cbor_err);
}
pcnProtected = _COSE_arrayget_int(pMessage, INDEX_PROTECTED);
CHECK_CONDITION(pcnProtected != nullptr, COSE_ERR_INTERNAL);
for (pSigner = pMessage->m_counterSigners; pSigner != nullptr;
pSigner = pSigner->m_next) {
CHECK_CONDITION(
pSigner->m_signer.m_signerNext == nullptr, COSE_ERR_INTERNAL);
pcn = cn_cbor_data_create(pcnProtected->v.bytes, pcnProtected->v.count,
CBOR_CONTEXT_PARAM_COMMA & cbor_err);
CHECK_CONDITION_CBOR(pcnProtected != nullptr, cbor_err);
pcn2 = cn_cbor_clone(pcnBody, CBOR_CONTEXT_PARAM_COMMA & cbor_err);
CHECK_CONDITION_CBOR(pcnBody != nullptr, cbor_err);
if (!_COSE_Signer_sign(&pSigner->m_signer, pcnBody, pcn2, perr))
goto errorReturn;
pcn = nullptr;
pcn2 = nullptr;
if (pArray != nullptr) {
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 != nullptr)
CN_CBOR_FREE(pArray, context);
if ((pcn != nullptr) && (pcn->parent != nullptr))
CN_CBOR_FREE(pcn, context);
if ((pcn2 != nullptr) && (pcn2->parent != nullptr))
CN_CBOR_FREE(pcn2, context);
return false;
}
#endif