CC_INLINE int ccCoreZP2pointerAndData(size_t n, const cc_unit *source, uint8_t *dest, size_t *destLen) { size_t len; if((len = ccn_write_uint_size(n, source)) > *destLen) { return -1; } *destLen = len; ccn_write_uint(n, source, *destLen, dest); return 0; }
static inline CCCryptorStatus ccn_write_arg(size_t n, const cc_unit *source, uint8_t *dest, size_t *destLen) { size_t len; if((len = ccn_write_uint_size(n, source)) > *destLen) { return kCCMemoryFailure; } *destLen = len; ccn_write_uint(n, source, *destLen, dest); return kCCSuccess; }
int ccec_get_fullkey_components(ccec_full_ctx_t key, size_t *nbits, uint8_t *x, size_t *xsize, uint8_t *y, size_t *ysize, uint8_t *d, size_t *dsize) { cc_size n = ccec_ctx_n(key); size_t len; if(ccec_get_pubkey_components(key, nbits, x, xsize, y, ysize)) return -1; if((len = ccn_write_uint_size(n, ccec_ctx_k(key))) > *dsize) return -1; *dsize = len; ccn_write_uint(n, ccec_ctx_k(key), *dsize, d); return 0; }
CFDataRef SecKeyCopyExponent(SecKeyRef key) { ccrsa_pub_ctx_t pubkey; pubkey.pub = key->key; size_t e_size = ccn_write_uint_size(ccrsa_ctx_n(pubkey), ccrsa_ctx_e(pubkey)); CFAllocatorRef allocator = CFGetAllocator(key); CFMutableDataRef exponentData = CFDataCreateMutable(allocator, e_size); if (exponentData == NULL) return NULL; CFDataSetLength(exponentData, e_size); ccn_write_uint(ccrsa_ctx_n(pubkey), ccrsa_ctx_m(pubkey), e_size, CFDataGetMutableBytePtr(exponentData)); return exponentData; }
CFDataRef SecKeyCopyModulus(SecKeyRef key) { ccrsa_pub_ctx_t pubkey; pubkey.pub = key->key; size_t m_size = ccn_write_uint_size(ccrsa_ctx_n(pubkey), ccrsa_ctx_m(pubkey)); CFAllocatorRef allocator = CFGetAllocator(key); CFMutableDataRef modulusData = CFDataCreateMutable(allocator, m_size); if (modulusData == NULL) return NULL; CFDataSetLength(modulusData, m_size); ccn_write_uint(ccrsa_ctx_n(pubkey), ccrsa_ctx_m(pubkey), m_size, CFDataGetMutableBytePtr(modulusData)); return modulusData; }
OSStatus SecDHGenerateKeypair(SecDHContext dh, uint8_t *pub_key, size_t *pub_key_len) { int result; ccdh_gp_t gp = SecDH_gp(dh); ccdh_full_ctx_t priv = SecDH_priv(dh); if((result = ccdh_generate_key(gp, &dhrng, priv))) return result; /* output y as a big endian byte buffer */ size_t ylen = ccn_write_uint_size(ccdh_gp_n(gp), ccdh_ctx_y(priv)); if(*pub_key_len < ylen) return errSecBufferTooSmall; ccn_write_uint(ccdh_gp_n(gp),ccdh_ctx_y(priv), ylen, pub_key); *pub_key_len = ylen; return errSecSuccess; }
OSStatus SecDHComputeKey(SecDHContext dh, const uint8_t *pub_key, size_t pub_key_len, uint8_t *computed_key, size_t *computed_key_len) { ccdh_gp_t gp = SecDH_gp(dh); ccdh_full_ctx_t priv = SecDH_priv(dh); ccdh_pub_ctx_decl_gp(gp, pub); cc_size n = ccdh_gp_n(gp); cc_unit r[n]; if(ccdh_import_pub(gp, pub_key_len, pub_key, pub)) return errSecInvalidKey; if(ccdh_compute_key(priv, pub, r)) return errSecInvalidKey; ccn_write_uint(n, r, *computed_key_len, computed_key); size_t out_size = ccn_write_uint_size(n, r); if(out_size < *computed_key_len) *computed_key_len=out_size; return errSecSuccess; }