diff --git a/src/context.c b/src/context.c index 4ee4b5de..e5ddf9a6 100644 --- a/src/context.c +++ b/src/context.c @@ -633,11 +633,11 @@ _getdns_upstreams_dereference(getdns_upstreams *upstreams) } } if (upstream->tls_session != NULL) - _getdns_tls_session_free(upstream->tls_session); + _getdns_tls_session_free(&upstreams->mf, upstream->tls_session); if (upstream->tls_obj != NULL) { _getdns_tls_connection_shutdown(upstream->tls_obj); - _getdns_tls_connection_free(upstream->tls_obj); + _getdns_tls_connection_free(&upstreams->mf, upstream->tls_obj); } if (upstream->fd != -1) { @@ -750,7 +750,7 @@ _getdns_upstream_reset(getdns_upstream *upstream) } if (upstream->tls_obj != NULL) { _getdns_tls_connection_shutdown(upstream->tls_obj); - _getdns_tls_connection_free(upstream->tls_obj); + _getdns_tls_connection_free(&upstream->upstreams->mf, upstream->tls_obj); upstream->tls_obj = NULL; } if (upstream->fd != -1) { @@ -1681,7 +1681,7 @@ getdns_context_destroy(struct getdns_context *context) GETDNS_FREE(context->my_mf, context->dns_transports); if (context->tls_ctx) - _getdns_tls_context_free(context->tls_ctx); + _getdns_tls_context_free(&context->my_mf, context->tls_ctx); getdns_list_destroy(context->dns_root_servers); @@ -3544,13 +3544,13 @@ _getdns_context_prepare_for_resolution(getdns_context *context) } if (context->tls_ctx == NULL) { - context->tls_ctx = _getdns_tls_context_new(); + context->tls_ctx = _getdns_tls_context_new(&context->my_mf); if (context->tls_ctx == NULL) return GETDNS_RETURN_BAD_CONTEXT; r = _getdns_tls_context_set_min_proto_1_2(context->tls_ctx); if (r && r != GETDNS_RETURN_NOT_IMPLEMENTED) { - _getdns_tls_context_free(context->tls_ctx); + _getdns_tls_context_free(&context->my_mf, context->tls_ctx); context->tls_ctx = NULL; return GETDNS_RETURN_BAD_CONTEXT; } diff --git a/src/openssl/tls.c b/src/openssl/tls.c index 611fbf3b..f14603fb 100644 --- a/src/openssl/tls.c +++ b/src/openssl/tls.c @@ -73,14 +73,14 @@ static int _getdns_tls_verify_always_ok(int ok, X509_STORE_CTX *ctx) return 1; } -static _getdns_tls_x509* _getdns_tls_x509_new(X509* cert) +static _getdns_tls_x509* _getdns_tls_x509_new(struct mem_funcs* mfs, X509* cert) { _getdns_tls_x509* res; if (!cert) return NULL; - res = malloc(sizeof(_getdns_tls_x509)); + res = GETDNS_MALLOC(*mfs, _getdns_tls_x509); if (res) res->ssl = cert; @@ -187,11 +187,11 @@ void _getdns_tls_init() (void)OPENSSL_init_ssl(0, NULL); } -_getdns_tls_context* _getdns_tls_context_new() +_getdns_tls_context* _getdns_tls_context_new(struct mem_funcs* mfs) { _getdns_tls_context* res; - if (!(res = malloc(sizeof(struct _getdns_tls_context)))) + if (!(res = GETDNS_MALLOC(*mfs, struct _getdns_tls_context))) return NULL; /* Create client context, use TLS v1.2 only for now */ @@ -201,18 +201,18 @@ _getdns_tls_context* _getdns_tls_context_new() res->ssl = SSL_CTX_new(TLSv1_2_client_method()); # endif if(res->ssl == NULL) { - free(res); + GETDNS_FREE(*mfs, res); return NULL; } return res; } -getdns_return_t _getdns_tls_context_free(_getdns_tls_context* ctx) +getdns_return_t _getdns_tls_context_free(struct mem_funcs* mfs, _getdns_tls_context* ctx) { if (!ctx || !ctx->ssl) return GETDNS_RETURN_INVALID_PARAMETER; SSL_CTX_free(ctx->ssl); - free(ctx); + GETDNS_FREE(*mfs, ctx); return GETDNS_RETURN_GOOD; } @@ -270,25 +270,25 @@ getdns_return_t _getdns_tls_context_set_ca(_getdns_tls_context* ctx, const char* return GETDNS_RETURN_GENERIC_ERROR; } -_getdns_tls_connection* _getdns_tls_connection_new(_getdns_tls_context* ctx, int fd) +_getdns_tls_connection* _getdns_tls_connection_new(struct mem_funcs* mfs, _getdns_tls_context* ctx, int fd) { _getdns_tls_connection* res; if (!ctx || !ctx->ssl) return NULL; - if (!(res = malloc(sizeof(struct _getdns_tls_connection)))) + if (!(res = GETDNS_MALLOC(*mfs, struct _getdns_tls_connection))) return NULL; res->ssl = SSL_new(ctx->ssl); if (!res->ssl) { - free(res); + GETDNS_FREE(*mfs, res); return NULL; } if (!SSL_set_fd(res->ssl, fd)) { SSL_free(res->ssl); - free(res); + GETDNS_FREE(*mfs, res); return NULL; } @@ -300,12 +300,12 @@ _getdns_tls_connection* _getdns_tls_connection_new(_getdns_tls_context* ctx, int return res; } -getdns_return_t _getdns_tls_connection_free(_getdns_tls_connection* conn) +getdns_return_t _getdns_tls_connection_free(struct mem_funcs* mfs, _getdns_tls_connection* conn) { if (!conn || !conn->ssl) return GETDNS_RETURN_INVALID_PARAMETER; SSL_free(conn->ssl); - free(conn); + GETDNS_FREE(*mfs, conn); return GETDNS_RETURN_GOOD; } @@ -353,19 +353,19 @@ getdns_return_t _getdns_tls_connection_set_session(_getdns_tls_connection* conn, return GETDNS_RETURN_GOOD; } -_getdns_tls_session* _getdns_tls_connection_get_session(_getdns_tls_connection* conn) +_getdns_tls_session* _getdns_tls_connection_get_session(struct mem_funcs* mfs, _getdns_tls_connection* conn) { _getdns_tls_session* res; if (!conn || !conn->ssl) return NULL; - if (!(res = malloc(sizeof(struct _getdns_tls_session)))) + if (!(res = GETDNS_MALLOC(*mfs, struct _getdns_tls_session))) return NULL; res->ssl = SSL_get1_session(conn->ssl); if (!res->ssl) { - free(res); + GETDNS_FREE(*mfs, res); return NULL; } @@ -404,12 +404,12 @@ getdns_return_t _getdns_tls_connection_do_handshake(_getdns_tls_connection* conn } } -_getdns_tls_x509* _getdns_tls_connection_get_peer_certificate(_getdns_tls_connection* conn) +_getdns_tls_x509* _getdns_tls_connection_get_peer_certificate(struct mem_funcs* mfs, _getdns_tls_connection* conn) { if (!conn || !conn->ssl) return NULL; - return _getdns_tls_x509_new(SSL_get_peer_certificate(conn->ssl)); + return _getdns_tls_x509_new(mfs, SSL_get_peer_certificate(conn->ssl)); } getdns_return_t _getdns_tls_connection_is_session_reused(_getdns_tls_connection* conn) @@ -552,12 +552,12 @@ getdns_return_t _getdns_tls_connection_write(_getdns_tls_connection* conn, uint8 return GETDNS_RETURN_GOOD; } -getdns_return_t _getdns_tls_session_free(_getdns_tls_session* s) +getdns_return_t _getdns_tls_session_free(struct mem_funcs* mfs, _getdns_tls_session* s) { if (!s || !s->ssl) return GETDNS_RETURN_INVALID_PARAMETER; SSL_SESSION_free(s->ssl); - free(s); + GETDNS_FREE(*mfs, s); return GETDNS_RETURN_GOOD; } @@ -594,22 +594,38 @@ getdns_return_t _getdns_tls_get_api_information(getdns_dict* dict) return GETDNS_RETURN_GENERIC_ERROR; } -void _getdns_tls_x509_free(_getdns_tls_x509* cert) +void _getdns_tls_x509_free(struct mem_funcs* mfs, _getdns_tls_x509* cert) { if (cert && cert->ssl) X509_free(cert->ssl); - free(cert); + GETDNS_FREE(*mfs, cert); } -int _getdns_tls_x509_to_der(_getdns_tls_x509* cert, uint8_t** buf) +int _getdns_tls_x509_to_der(struct mem_funcs* mfs, _getdns_tls_x509* cert, getdns_bindata* bindata) { - if (!cert || !cert->ssl) + unsigned char* buf = NULL; + int len; + + if (!cert || !cert->ssl ) return 0; - return i2d_X509(cert->ssl, buf); + if (bindata == NULL) + return i2d_X509(cert->ssl, NULL); + + len = i2d_X509(cert->ssl, &buf); + if (len == 0 || (bindata->data = GETDNS_XMALLOC(*mfs, uint8_t, len)) == NULL) { + bindata->size = 0; + bindata->data = NULL; + } else { + bindata->size = len; + (void) memcpy(bindata->data, buf, len); + OPENSSL_free(buf); + } + + return len; } -unsigned char* _getdns_tls_hmac_hash(int algorithm, const void* key, size_t key_size, const void* data, size_t data_size, size_t* output_size) +unsigned char* _getdns_tls_hmac_hash(struct mem_funcs* mfs, int algorithm, const void* key, size_t key_size, const void* data, size_t data_size, size_t* output_size) { const EVP_MD* digester; unsigned char* res; @@ -637,7 +653,7 @@ unsigned char* _getdns_tls_hmac_hash(int algorithm, const void* key, size_t key_ default : return NULL; } - res = (unsigned char*) malloc(EVP_MAX_MD_SIZE); + res = (unsigned char*) GETDNS_XMALLOC(*mfs, unsigned char, EVP_MAX_MD_SIZE); if (!res) return NULL; @@ -648,7 +664,7 @@ unsigned char* _getdns_tls_hmac_hash(int algorithm, const void* key, size_t key_ return res; } -_getdns_tls_hmac* _getdns_tls_hmac_new(int algorithm, const void* key, size_t key_size) +_getdns_tls_hmac* _getdns_tls_hmac_new(struct mem_funcs* mfs, int algorithm, const void* key, size_t key_size) { const EVP_MD *digester; _getdns_tls_hmac* res; @@ -675,13 +691,13 @@ _getdns_tls_hmac* _getdns_tls_hmac_new(int algorithm, const void* key, size_t ke default : return NULL; } - if (!(res = malloc(sizeof(struct _getdns_tls_hmac)))) + if (!(res = GETDNS_MALLOC(*mfs, struct _getdns_tls_hmac))) return NULL; #ifdef HAVE_HMAC_CTX_NEW res->ctx = HMAC_CTX_new(); if (!res->ctx) { - free(res); + GETDNS_FREE(*mfs, res); return NULL; } #else @@ -692,7 +708,7 @@ _getdns_tls_hmac* _getdns_tls_hmac_new(int algorithm, const void* key, size_t ke #ifdef HAVE_HMAC_CTX_NEW HMAC_CTX_free(res->ctx); #endif - free(res); + GETDNS_FREE(*mfs, res); return NULL; } @@ -710,12 +726,12 @@ getdns_return_t _getdns_tls_hmac_add(_getdns_tls_hmac* h, const void* data, size return GETDNS_RETURN_GOOD; } -unsigned char* _getdns_tls_hmac_end(_getdns_tls_hmac* h, size_t* output_size) +unsigned char* _getdns_tls_hmac_end(struct mem_funcs* mfs, _getdns_tls_hmac* h, size_t* output_size) { unsigned char* res; unsigned int md_len; - res = (unsigned char*) malloc(EVP_MAX_MD_SIZE); + res = (unsigned char*) GETDNS_XMALLOC(*mfs, unsigned char, EVP_MAX_MD_SIZE); if (!res) return NULL; @@ -724,7 +740,7 @@ unsigned char* _getdns_tls_hmac_end(_getdns_tls_hmac* h, size_t* output_size) #ifdef HAVE_HMAC_CTX_NEW HMAC_CTX_free(h->ctx); #endif - free(h); + GETDNS_FREE(*mfs, h); if (output_size) *output_size = md_len; diff --git a/src/request-internal.c b/src/request-internal.c index 1b2a7cb4..76ce6e3e 100644 --- a/src/request-internal.c +++ b/src/request-internal.c @@ -125,7 +125,7 @@ network_req_cleanup(getdns_network_req *net_req) GETDNS_FREE(net_req->owner->my_mf, net_req->response); if (net_req->debug_tls_peer_cert.size && net_req->debug_tls_peer_cert.data) - OPENSSL_free(net_req->debug_tls_peer_cert.data); + GETDNS_FREE(net_req->owner->my_mf, net_req->debug_tls_peer_cert.data); } static uint8_t * @@ -435,7 +435,7 @@ _getdns_network_req_add_tsig(getdns_network_req *req) gldns_buffer_write_u16(&gbuf, 0); /* Error */ gldns_buffer_write_u16(&gbuf, 0); /* Other len */ - md_buf = _getdns_tls_hmac_hash(upstream->tsig_alg, upstream->tsig_key, upstream->tsig_size, (void *)req->query, gldns_buffer_current(&gbuf) - req->query, &md_len); + md_buf = _getdns_tls_hmac_hash(&req->owner->my_mf, upstream->tsig_alg, upstream->tsig_key, upstream->tsig_size, (void *)req->query, gldns_buffer_current(&gbuf) - req->query, &md_len); if (!md_buf) return req->response - req->query; @@ -457,7 +457,7 @@ _getdns_network_req_add_tsig(getdns_network_req *req) gldns_buffer_write_u16(&gbuf, 0); /* Error */ gldns_buffer_write_u16(&gbuf, 0); /* Other len */ - free(md_buf); + GETDNS_FREE(req->owner->my_mf, md_buf); if (gldns_buffer_position(&gbuf) > gldns_buffer_limit(&gbuf)) return req->response - req->query; @@ -595,14 +595,14 @@ _getdns_network_validate_tsig(getdns_network_req *req) gldns_read_uint16(req->response + 10) - 1); gldns_write_uint16(req->response, original_id); - hmac = _getdns_tls_hmac_new(req->upstream->tsig_alg, req->upstream->tsig_key, req->upstream->tsig_size); + hmac = _getdns_tls_hmac_new(&req->owner->my_mf, req->upstream->tsig_alg, req->upstream->tsig_key, req->upstream->tsig_size); if (!hmac) return; _getdns_tls_hmac_add(hmac, request_mac - 2, request_mac_len + 2); _getdns_tls_hmac_add(hmac, req->response, rr->pos - req->response); _getdns_tls_hmac_add(hmac, tsig_vars, gldns_buffer_position(&gbuf)); - result_mac = _getdns_tls_hmac_end(hmac, &result_mac_len); + result_mac = _getdns_tls_hmac_end(&req->owner->my_mf, hmac, &result_mac_len); if (!result_mac) return; @@ -612,6 +612,8 @@ _getdns_network_validate_tsig(getdns_network_req *req) memcmp(result_mac, response_mac, result_mac_len) == 0) req->tsig_status = GETDNS_DNSSEC_SECURE; + GETDNS_FREE(req->owner->my_mf, result_mac); + gldns_write_uint16(req->response, gldns_read_uint16(req->query)); gldns_write_uint16(req->response + 10, gldns_read_uint16(req->response + 10) + 1); diff --git a/src/stub.c b/src/stub.c index ca4c55d0..3bbcc53f 100644 --- a/src/stub.c +++ b/src/stub.c @@ -830,7 +830,7 @@ tls_create_object(getdns_dns_req *dnsreq, int fd, getdns_upstream *upstream) getdns_context *context = dnsreq->context; if (context->tls_ctx == NULL) return NULL; - _getdns_tls_connection* tls = _getdns_tls_connection_new(context->tls_ctx, fd); + _getdns_tls_connection* tls = _getdns_tls_connection_new(&context->my_mf, context->tls_ctx, fd); if(!tls) return NULL; #if HAVE_TLS_CONN_CURVES_LIST @@ -839,7 +839,7 @@ tls_create_object(getdns_dns_req *dnsreq, int fd, getdns_upstream *upstream) #endif /* make sure we'll be able to find the context again when we need it */ if (_getdns_associate_upstream_with_connection(tls, upstream) != GETDNS_RETURN_GOOD) { - _getdns_tls_connection_free(tls); + _getdns_tls_connection_free(&context->my_mf, tls); return NULL; } @@ -871,7 +871,7 @@ tls_create_object(getdns_dns_req *dnsreq, int fd, getdns_upstream *upstream) "%-40s : Verify fail: *CONFIG ERROR* - No auth name or pinset provided for this upstream for Strict TLS authentication\n", upstream->addr_str); upstream->tls_hs_state = GETDNS_HS_FAILED; - _getdns_tls_connection_free(tls); + _getdns_tls_connection_free(&upstream->upstreams->mf, tls); upstream->tls_auth_state = GETDNS_AUTH_FAILED; return NULL; } @@ -947,7 +947,7 @@ tls_do_handshake(getdns_upstream *upstream) upstream->tls_auth_state = upstream->last_tls_auth_state; else if (upstream->tls_pubkey_pinset || upstream->tls_auth_name[0]) { - _getdns_tls_x509* peer_cert = _getdns_tls_connection_get_peer_certificate(upstream->tls_obj); + _getdns_tls_x509* peer_cert = _getdns_tls_connection_get_peer_certificate(&upstream->upstreams->mf, upstream->tls_obj); if (!peer_cert) { _getdns_upstream_log(upstream, @@ -994,7 +994,7 @@ tls_do_handshake(getdns_upstream *upstream) "%-40s : Verify passed : TLS\n", upstream->addr_str); } - _getdns_tls_x509_free(peer_cert); + _getdns_tls_x509_free(&upstream->upstreams->mf, peer_cert); } if (upstream->tls_auth_state == GETDNS_AUTH_FAILED && !upstream->tls_fallback_ok) @@ -1008,8 +1008,8 @@ tls_do_handshake(getdns_upstream *upstream) upstream->conn_state = GETDNS_CONN_OPEN; upstream->conn_completed++; if (upstream->tls_session != NULL) - _getdns_tls_session_free(upstream->tls_session); - upstream->tls_session = _getdns_tls_connection_get_session(upstream->tls_obj); + _getdns_tls_session_free(&upstream->upstreams->mf, upstream->tls_session); + upstream->tls_session = _getdns_tls_connection_get_session(&upstream->upstreams->mf, upstream->tls_obj); /* Reset timeout on success*/ GETDNS_CLEAR_EVENT(upstream->loop, &upstream->event); upstream->event.read_cb = NULL; @@ -1634,10 +1634,9 @@ upstream_write_cb(void *userarg) if (netreq->owner->return_call_reporting && netreq->upstream->tls_obj) { if (netreq->debug_tls_peer_cert.data == NULL && - (cert = _getdns_tls_connection_get_peer_certificate(netreq->upstream->tls_obj))) { - netreq->debug_tls_peer_cert.size = _getdns_tls_x509_to_der( - cert, &netreq->debug_tls_peer_cert.data); - _getdns_tls_x509_free(cert); + (cert = _getdns_tls_connection_get_peer_certificate(&upstream->upstreams->mf, netreq->upstream->tls_obj))) { + _getdns_tls_x509_to_der(&upstream->upstreams->mf, cert, &netreq->debug_tls_peer_cert); + _getdns_tls_x509_free(&upstream->upstreams->mf, cert); } netreq->debug_tls_version = _getdns_tls_connection_get_version(netreq->upstream->tls_obj); } diff --git a/src/tls.h b/src/tls.h index a70ea1bb..8adc47e7 100644 --- a/src/tls.h +++ b/src/tls.h @@ -55,18 +55,20 @@ void _getdns_tls_init(); /** * Create a new TLS context. * + * @param mfs point to getdns memory functions. * @return pointer to new context or NULL on error. */ -_getdns_tls_context* _getdns_tls_context_new(); +_getdns_tls_context* _getdns_tls_context_new(struct mem_funcs* mfs); /** * Free a TLS context. * + * @param mfs point to getdns memory functions. * @param ctx the context to free. * @return GETDNS_RETURN_GOOD on success. * @return GETDNS_RETURN_INVALID_PARAMETER if ctx is invalid. */ -getdns_return_t _getdns_tls_context_free(_getdns_tls_context* ctx); +getdns_return_t _getdns_tls_context_free(struct mem_funcs* mfs, _getdns_tls_context* ctx); /** * Set TLS 1.2 as minimum TLS version. @@ -121,20 +123,22 @@ getdns_return_t _getdns_tls_context_set_ca(_getdns_tls_context* ctx, const char* /** * Create a new TLS connection and associate it with a file descriptior. * + * @param mfs pointer to getdns memory functions. * @param ctx the context. * @param fd the file descriptor to associate with the connection. * @return pointer to new connection or NULL on error. */ -_getdns_tls_connection* _getdns_tls_connection_new(_getdns_tls_context* ctx, int fd); +_getdns_tls_connection* _getdns_tls_connection_new(struct mem_funcs* mfs, _getdns_tls_context* ctx, int fd); /** * Free a TLS connection. * + * @param mfs pointer to getdns memory functions. * @param conn the connection to free. * @return GETDNS_RETURN_GOOD on success. * @return GETDNS_RETURN_INVALID_PARAMETER if conn is invalid. */ -getdns_return_t _getdns_tls_connection_free(_getdns_tls_connection* ctx); +getdns_return_t _getdns_tls_connection_free(struct mem_funcs* mfs, _getdns_tls_connection* conn); /** * Shut down a TLS connection. @@ -184,10 +188,11 @@ getdns_return_t _getdns_tls_connection_set_session(_getdns_tls_connection* conn, /** * Get the session for this connection. * + * @param mfs pointer to getdns memory functions. * @param conn the connection. * @return pointer to the session or NULL on error. */ -_getdns_tls_session* _getdns_tls_connection_get_session(_getdns_tls_connection* conn); +_getdns_tls_session* _getdns_tls_connection_get_session(struct mem_funcs* mfs, _getdns_tls_connection* conn); /** * Report the TLS version of the connection. @@ -212,10 +217,11 @@ getdns_return_t _getdns_tls_connection_do_handshake(_getdns_tls_connection* conn /** * Get the connection peer certificate. * + * @param mfs pointer to getdns memory functions. * @param conn the connection. * @return certificate or NULL on error. */ -_getdns_tls_x509* _getdns_tls_connection_get_peer_certificate(_getdns_tls_connection* conn); +_getdns_tls_x509* _getdns_tls_connection_get_peer_certificate(struct mem_funcs* mfs, _getdns_tls_connection* conn); /** * See whether the connection is reusing a session. @@ -289,23 +295,32 @@ getdns_return_t _getdns_tls_connection_read(_getdns_tls_connection* conn, uint8_ */ getdns_return_t _getdns_tls_connection_write(_getdns_tls_connection* conn, uint8_t* buf, size_t to_write, size_t* written); -getdns_return_t _getdns_tls_session_free(_getdns_tls_session* s); +/** + * Free a session. + * + * @param mfs pointer to getdns memory functions. + * @param s the session. + * @return GETDNS_RETURN_GOOD on success. + * @return GETDNS_RETURN_INVALID_PARAMETER if s is null or has no SSL. + */ +getdns_return_t _getdns_tls_session_free(struct mem_funcs* mfs, _getdns_tls_session* s); /** * Free X509 certificate. * + * @param mfs pointer to getdns memory functions. * @param cert the certificate. */ -void _getdns_tls_x509_free(_getdns_tls_x509* cert); +void _getdns_tls_x509_free(struct mem_funcs* mfs, _getdns_tls_x509* cert); /** * Convert X509 to DER. * * @param cert the certificate. - * @param buf buffer to receive conversion. NULL to just get the length. + * @param buf buffer to receive conversion. * @return length of conversion, 0 on error. */ -int _getdns_tls_x509_to_der(_getdns_tls_x509* cert, uint8_t** buf); +int _getdns_tls_x509_to_der(struct mem_funcs* mfs, _getdns_tls_x509* cert, getdns_bindata* bindata); /** * Fill in dictionary with TLS API information. @@ -319,6 +334,7 @@ getdns_return_t _getdns_tls_get_api_information(getdns_dict* dict); /** * Return buffer with HMAC hash. * + * @param mfs pointer to getdns memory functions. * @param algorithm hash algorithm to use (GETDNS_HMAC_?). * @param key the key. * @param key_size the key size. @@ -327,17 +343,18 @@ getdns_return_t _getdns_tls_get_api_information(getdns_dict* dict); * @param output_size the output size will be written here if not NULL. * @return output malloc'd buffer with output, NULL on error. */ -unsigned char* _getdns_tls_hmac_hash(int algorithm, const void* key, size_t key_size, const void* data, size_t data_size, size_t* output_size); +unsigned char* _getdns_tls_hmac_hash(struct mem_funcs* mfs, int algorithm, const void* key, size_t key_size, const void* data, size_t data_size, size_t* output_size); /** * Return a new HMAC handle. * + * @param mfs pointer to getdns memory functions. * @param algorithm hash algorithm to use (GETDNS_HMAC_?). * @param key the key. * @param key_size the key size. * @return HMAC handle or NULL on error. */ -_getdns_tls_hmac* _getdns_tls_hmac_new(int algorithm, const void* key, size_t key_size); +_getdns_tls_hmac* _getdns_tls_hmac_new(struct mem_funcs* mfs, int algorithm, const void* key, size_t key_size); /** * Add data to a HMAC. @@ -354,10 +371,11 @@ getdns_return_t _getdns_tls_hmac_add(_getdns_tls_hmac* h, const void* data, size /** * Return the HMAC digest and free the handle. * + * @param mfs pointer to getdns memory functions. * @param h the HMAC. * @param output_size the output size will be written here if not NULL. * @return output malloc'd buffer with output, NULL on error. */ -unsigned char* _getdns_tls_hmac_end(_getdns_tls_hmac* h, size_t* output_size); +unsigned char* _getdns_tls_hmac_end(struct mem_funcs* mfs, _getdns_tls_hmac* h, size_t* output_size); #endif /* _GETDNS_TLS_H */ diff --git a/src/util-internal.c b/src/util-internal.c index 0bceb002..a1cc11c5 100644 --- a/src/util-internal.c +++ b/src/util-internal.c @@ -933,7 +933,7 @@ _getdns_create_call_reporting_dict( return NULL; } netreq->debug_tls_peer_cert.size = 0; - OPENSSL_free(netreq->debug_tls_peer_cert.data); + GETDNS_FREE(context->my_mf, netreq->debug_tls_peer_cert.data); netreq->debug_tls_peer_cert.data = NULL; return netreq_debug; }