CommonGCMCryptor.c [plain text]
#include "ccMemory.h"
#include "ccdebug.h"
#include "CommonCryptor.h"
#include "CommonCryptorSPI.h"
#include "CommonCryptorPriv.h"
#include <corecrypto/ccmode_factory.h>
CCCryptorStatus
CCCryptorGCMAddIV(CCCryptorRef cryptorRef,
const void *iv,
size_t ivLen)
{
CCCompatCryptor *compat_cryptor = cryptorRef;
CCCryptor *cryptor;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering\n");
if(compat_cryptor == NULL) return kCCParamError;
cryptor = compat_cryptor->cryptor;
ccmode_gcm_set_iv(cryptor->ctx[cryptor->op].gcm, ivLen, iv);
return kCCSuccess;
}
CCCryptorStatus
CCCryptorGCMAddAAD(CCCryptorRef cryptorRef,
const void *aData,
size_t aDataLen)
{
CCCompatCryptor *compat_cryptor = cryptorRef;
CCCryptor *cryptor;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering\n");
if(compat_cryptor == NULL) return kCCParamError;
cryptor = compat_cryptor->cryptor;
ccmode_gcm_gmac(cryptor->ctx[cryptor->op].gcm, aDataLen, aData);
return kCCSuccess;
}
CCCryptorStatus
CCCryptorGCMAddADD(CCCryptorRef cryptorRef,
const void *aData,
size_t aDataLen)
{
return CCCryptorGCMAddAAD(cryptorRef, aData, aDataLen);
}
CCCryptorStatus
CCCryptorGCMaddAAD(CCCryptorRef cryptorRef,
const void *aData,
size_t aDataLen)
{
return CCCryptorGCMAddAAD(cryptorRef, aData, aDataLen);
}
CCCryptorStatus CCCryptorGCMEncrypt(
CCCryptorRef cryptorRef,
const void *dataIn,
size_t dataInLength,
void *dataOut)
{
CCCompatCryptor *compat_cryptor = cryptorRef;
CCCryptor *cryptor;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering\n");
if(compat_cryptor == NULL) return kCCParamError;
cryptor = compat_cryptor->cryptor;
if(dataIn == NULL || dataOut == NULL) return kCCParamError;
ccmode_gcm_encrypt(cryptor->ctx[cryptor->op].gcm, dataInLength, dataIn, dataOut);
return kCCSuccess;
}
CCCryptorStatus CCCryptorGCMDecrypt(
CCCryptorRef cryptorRef,
const void *dataIn,
size_t dataInLength,
void *dataOut)
{
CCCompatCryptor *compat_cryptor = cryptorRef;
CCCryptor *cryptor;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering\n");
if(compat_cryptor == NULL) return kCCParamError;
cryptor = compat_cryptor->cryptor;
if(dataIn == NULL || dataOut == NULL) return kCCParamError;
ccmode_gcm_decrypt(cryptor->ctx[cryptor->op].gcm, dataInLength, dataIn, dataOut);
return kCCSuccess;
}
CCCryptorStatus CCCryptorGCMFinal(
CCCryptorRef cryptorRef,
const void *tag,
size_t *tagLength)
{
CCCompatCryptor *compat_cryptor = cryptorRef;
CCCryptor *cryptor;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering\n");
if(compat_cryptor == NULL) return kCCParamError;
cryptor = compat_cryptor->cryptor;
if(tag == NULL || tagLength == NULL) return kCCParamError;
ccmode_gcm_finalize(cryptor->ctx[cryptor->op].gcm, tagLength, tag);
return kCCSuccess;
}
CCCryptorStatus CCCryptorGCMReset(
CCCryptorRef cryptorRef)
{
CCCompatCryptor *compat_cryptor = cryptorRef;
CCCryptor *cryptor;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering\n");
if(compat_cryptor == NULL) return kCCParamError;
cryptor = compat_cryptor->cryptor;
ccmode_gcm_reset(cryptor->ctx[cryptor->op].gcm);
return kCCSuccess;
}
CCCryptorStatus CCCryptorGCM(
CCOperation op,
CCAlgorithm alg,
const void *key,
size_t keyLength,
const void *iv,
size_t ivLen,
const void *aData,
size_t aDataLen,
const void *dataIn,
size_t dataInLength,
void *dataOut,
const void *tag,
size_t *tagLength)
{
CCCryptorRef cryptorRef;
CCCryptorStatus retval;
CC_DEBUG_LOG(ASL_LEVEL_ERR, "Entering Op: %d Cipher: %d\n", op, alg);
retval = CCCryptorCreateWithMode(op, kCCModeGCM, alg, 0, NULL, key, keyLength,
NULL, 0, 0, 0, &cryptorRef);
if(retval) return retval;
if(ivLen) {
retval = CCCryptorGCMAddIV(cryptorRef, iv, ivLen);
if(retval) return retval;
}
retval = CCCryptorGCMaddAAD(cryptorRef, aData, aDataLen);
if(retval) return retval;
if(op == kCCEncrypt)
retval = CCCryptorGCMEncrypt(cryptorRef, dataIn, dataInLength, dataOut);
else if(op == kCCDecrypt)
retval = CCCryptorGCMDecrypt(cryptorRef, dataIn, dataInLength, dataOut);
else return kCCParamError;
if(retval) return retval;
retval = CCCryptorGCMFinal(cryptorRef, tag, tagLength);
CCCryptorRelease(cryptorRef);
return retval;
}