static void ccRSACryptorClear(CCRSACryptorRef theKey) { CCRSACryptor *key = (CCRSACryptor *) theKey; if(!key) return; CC_XZEROMEM(key, sizeof(CCRSACryptor)); CC_XFREE(key, sizeof(CCRSACryptor)); }
struct ccrng_state * ccDevRandomGetRngState(void) { cc_globals_t globals = _cc_globals(); dispatch_once(&globals->dev_random_init, ^{ globals->dev_random.rngtype = rng_devrandom; globals->dev_random.state.devrandom.devrandom = (struct ccrng_system_state *)CC_XMALLOC(sizeof(struct ccrng_system_state)); globals->dev_random.status=ccrng_system_init(globals->dev_random.state.devrandom.devrandom); if (globals->dev_random.status<0) { CC_XFREE(globals->dev_random.state.devrandom.devrandom,sizeof(struct ccrng_system_state)); globals->dev_random.state.devrandom.devrandom=NULL; } });
CCCryptorStatus CCRSACryptorDecodePayloadPKCS1( CCRSACryptorRef publicKey, const void *cipherText, size_t cipherTextLen, void *plainText, size_t *plainTextLen) { int tcReturn; int stat = 0; CCRSACryptor *publicCryptor = publicKey; uint8_t *message; unsigned long messageLen, modulusLen; CCCryptorStatus retval = kCCSuccess; modulusLen = CCRSAGetKeySize(publicKey); messageLen = modulusLen / 8; if((message = CC_XMALLOC(messageLen)) == NULL) return kCCMemoryFailure; tcReturn = rsa_exptmod(cipherText, cipherTextLen, message, messageLen, publicCryptor->keyType, &publicCryptor->key); if(tcReturn) { retval = kCCDecodeError; goto out; } tcReturn = pkcs_1_v1_5_decode(message, messageLen, LTC_PKCS_1_EME, modulusLen, plainText, plainTextLen, &stat); if(tcReturn) { retval = kCCDecodeError; goto out; } if(!stat) { retval = kCCDecodeError; goto out; } out: CC_XZEROMEM(message, messageLen); CC_XFREE(message, messageLen); return retval; }