#include "CommonCryptorPriv.h"
#include "StreamCipher.h"
#include <CommonCrypto/rc4.h>
static CCCryptorStatus CCRC4ContextSize(
CCOperation op,
CCAlgorithm alg,
size_t *ctxSize)
{
*ctxSize = sizeof(RC4_KEY);
return kCCSuccess;
}
static CCCryptorStatus CCRC4Init(
void *ctx,
CCOperation op,
CCAlgorithm alg,
CCOptions options,
const void *key,
size_t keyLength,
const void *iv)
{
RC4_KEY *rc4Key = (RC4_KEY *)ctx;
if(key == NULL) {
return kCCParamError;
}
RC4_set_key(rc4Key, keyLength, key);
return kCCSuccess;
}
static CCCryptorStatus CCRC4Update(
void *ctx,
const void *dataIn,
size_t dataInLen,
void *dataOut,
size_t dataOutAvailable,
size_t *dataOutMoved)
{
RC4_KEY *rc4Key = (RC4_KEY *)ctx;
if((dataIn == NULL) || (dataOut == NULL) || (dataOutMoved == NULL)) {
return kCCParamError;
}
if(dataOutAvailable < dataInLen) {
return kCCBufferTooSmall;
}
RC4(rc4Key, dataInLen, dataIn, dataOut);
*dataOutMoved = dataInLen;
return kCCSuccess;
}
static CCCryptorStatus CCRC4Final(
void *ctx,
void *dataOut,
size_t dataOutAvailable,
size_t *dataOutMoved)
{
if(dataOutMoved) {
*dataOutMoved = 0;
}
return kCCSuccess;
}
static size_t CCRC4OutputSize(
void *ctx, size_t inputLength, bool final)
{
return inputLength;
}
static CCCryptorStatus CCRC4OneShotSize(
CCOperation op,
CCAlgorithm alg,
CCOptions options,
size_t inputLen,
size_t *outputLen)
{
*outputLen = inputLen;
return kCCSuccess;
}
const CCCryptSpiCallouts ccRC4Callouts =
{
CCRC4ContextSize,
CCRC4Init,
NULL,
CCRC4Update,
CCRC4Final,
NULL,
CCRC4OutputSize,
CCRC4OneShotSize,
};