#include <CoreFoundation/CoreFoundation.h>
#include "corecrypto/ccsha1.h"
#include "corecrypto/ccrsa_priv.h"
#include "corecrypto/ccrng_system.h"
#include "corecrypto/ccn.h"
#include "stdio.h"
#include "misc.h"
#include "Utilities.h"
CFDataRef oaep_padding_via_c(int desired_message_length, CFDataRef dataValue);
CFDataRef oaep_padding_via_c(int desired_message_length, CFDataRef dataValue) CF_RETURNS_RETAINED
{
size_t pBufferSize = ccn_sizeof_size(desired_message_length);
cc_unit *paddingBuffer = malloc(pBufferSize);
if (paddingBuffer == NULL){
return (void*)GetNoMemoryErrorAndRetain();
}
bzero(paddingBuffer, pBufferSize); static dispatch_once_t randomNumberGenneratorInitialzed;
static struct ccrng_system_state rng;
dispatch_once(&randomNumberGenneratorInitialzed, ^{
ccrng_system_init(&rng);
});
ccrsa_oaep_encode(ccsha1_di(),
(struct ccrng_state*)&rng,
pBufferSize, (cc_unit*)paddingBuffer,
CFDataGetLength(dataValue), CFDataGetBytePtr(dataValue));
ccn_swap(ccn_nof_size(pBufferSize), (cc_unit*)paddingBuffer);
CFDataRef paddedValue = CFDataCreate(NULL, (UInt8*)paddingBuffer, desired_message_length);
free(paddingBuffer);
return paddedValue ? paddedValue : (void*)GetNoMemoryErrorAndRetain();
}
CFDataRef oaep_unpadding_via_c(CFDataRef encodedMessage);
CFDataRef oaep_unpadding_via_c(CFDataRef encodedMessage) CF_RETURNS_RETAINED
{
size_t mlen = CFDataGetLength(encodedMessage);
size_t pBufferSize = ccn_sizeof_size(mlen);
cc_unit *paddingBuffer = malloc(pBufferSize);
UInt8 *plainText = malloc(mlen);
if (plainText == NULL || paddingBuffer == NULL) {
free(plainText);
free(paddingBuffer);
return (void*)GetNoMemoryErrorAndRetain();
}
ccn_read_uint(ccn_nof_size(mlen), paddingBuffer, mlen, CFDataGetBytePtr(encodedMessage));
size_t plainTextLength = mlen;
int err = ccrsa_oaep_decode(ccsha1_di(), &plainTextLength, plainText, mlen, paddingBuffer);
if (err) {
CFErrorRef error = fancy_error(CFSTR("CoreCrypto"), err, CFSTR("OAEP decode error"));
CFRetainSafe(error);
free(plainText);
free(paddingBuffer);
return (void*)error;
}
CFDataRef result = CFDataCreate(NULL, (UInt8*)plainText, plainTextLength);
free(plainText);
free(paddingBuffer);
return result;
}