wi_data_t * wi_rsa_private_key(wi_rsa_t *rsa) { unsigned char *buffer; int length; if(!rsa->private_key) { buffer = NULL; length = i2d_RSAPrivateKey(rsa->rsa, &buffer); if(length <= 0) { wi_error_set_openssl_error(); return NULL; } rsa->private_key = wi_data_init_with_bytes(wi_data_alloc(), buffer, length); OPENSSL_free(buffer); } return rsa->private_key; }
wi_data_t * wi_string_encoding_data_from_utf8_bytes(wi_string_encoding_t *encoding, const char *buffer, wi_uinteger_t size) { wi_data_t *data; char *inbuffer, *outbuffer, *outbufferp; wi_uinteger_t inbytes, outbytes; size_t bytes, inbytesleft, outbytesleft; iconv_t iconvd; iconvd = iconv_open(wi_string_utf8_string(encoding->target_encoding), wi_string_utf8_string(encoding->utf8_encoding)); if(iconvd == (iconv_t) -1) { wi_error_set_errno(errno); return NULL; } inbytes = inbytesleft = size; outbytes = outbytesleft = size * 4; inbuffer = (char *) buffer; outbuffer = outbufferp = wi_malloc(outbytes); bytes = iconv(iconvd, &inbuffer, &inbytesleft, &outbuffer, &outbytesleft); if(bytes == (size_t) -1) { wi_free(outbufferp); iconv_close(iconvd); wi_error_set_errno(errno); return NULL; } data = wi_data_init_with_bytes(wi_data_alloc(), outbufferp, outbytes - outbytesleft); wi_free(outbufferp); iconv_close(iconvd); return wi_autorelease(data); }
static wi_runtime_instance_t * _wi_data_copy(wi_runtime_instance_t *instance) { wi_data_t *data = instance; return wi_data_init_with_bytes(wi_data_alloc(), data->bytes, data->length); }
wi_data_t * wi_data_with_bytes(const void *bytes, wi_uinteger_t length) { return wi_autorelease(wi_data_init_with_bytes(wi_data_alloc(), bytes, length)); }