#define CC_CHANGEFUNCTION_28544056_cccmac_init 1
#include <CommonCrypto/CommonCMACSPI.h>
#include "CommonCryptorPriv.h"
#include "ccdebug.h"
#include "ccMemory.h"
#include <corecrypto/cccmac.h>
#include <corecrypto/ccaes.h>
void CCAESCmac(const void *key,
const uint8_t *data,
size_t dataLength,
void *macOut)
{
cccmac_one_shot_generate(ccaes_cbc_encrypt_mode(),
CCAES_KEY_SIZE_128, key,
dataLength, data,
CCAES_BLOCK_SIZE, macOut);
}
struct CCCmacContext {
cccmac_ctx_t ctxptr;
};
CCCmacContextPtr
CCAESCmacCreate(const void *key, size_t keyLength)
{
CCCmacContextPtr retval = (CCCmacContextPtr) CC_XMALLOC(sizeof(struct CCCmacContext));
if(!retval) return NULL;
const struct ccmode_cbc *cbc = ccaes_cbc_encrypt_mode();
retval->ctxptr = CC_XMALLOC(cccmac_ctx_size(cbc));
if(retval->ctxptr == NULL) {
CC_XFREE(retval, sizeof(struct CCCmacContext));
return NULL;
}
if (key==NULL
|| cccmac_init(cbc, retval->ctxptr,
keyLength, key)!=0) {
CC_XFREE(retval->ctxptr, sizeof(cccmac_ctx_size(cbc)));
CC_XFREE(retval, sizeof(struct CCCmacContext));
return NULL;
}
return retval;
}
void CCAESCmacUpdate(CCCmacContextPtr ctx, const void *data, size_t dataLength) {
cccmac_update(ctx->ctxptr,dataLength,data);
}
void CCAESCmacFinal(CCCmacContextPtr ctx, void *macOut) {
cccmac_final_generate(ctx->ctxptr, 16, macOut);
}
void CCAESCmacDestroy(CCCmacContextPtr ctx) {
if(ctx) {
CC_XFREE(ctx->ctxptr, cccmac_ctx_size(retval->cbc));
CC_XFREE(ctx, sizeof(struct CCCmacContext));
}
}
size_t
CCAESCmacOutputSizeFromContext(CCCmacContextPtr ctx) {
return cccmac_cbc(ctx->ctxptr)->block_size;
}