|
Packit |
549fdc |
/*
|
|
Packit |
549fdc |
* Copyright (C) 2008-2016 Free Software Foundation, Inc.
|
|
Packit |
549fdc |
* Copyright (C) 2016 Red Hat, Inc.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* Author: Simon Josefsson, Nikos Mavrogiannopoulos
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* This file is part of GnuTLS.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* GnuTLS is free software; you can redistribute it and/or modify it
|
|
Packit |
549fdc |
* under the terms of the GNU General Public License as published by
|
|
Packit |
549fdc |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
549fdc |
* (at your option) any later version.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* GnuTLS is distributed in the hope that it will be useful, but
|
|
Packit |
549fdc |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
549fdc |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
549fdc |
* General Public License for more details.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* You should have received a copy of the GNU General Public License
|
|
Packit |
549fdc |
* along with GnuTLS; if not, write to the Free Software Foundation,
|
|
Packit |
549fdc |
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
Packit |
549fdc |
*/
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#ifdef HAVE_CONFIG_H
|
|
Packit |
549fdc |
#include <config.h>
|
|
Packit |
549fdc |
#endif
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#include <stdio.h>
|
|
Packit |
549fdc |
#include <stdlib.h>
|
|
Packit |
549fdc |
#include <string.h>
|
|
Packit |
549fdc |
#include <errno.h>
|
|
Packit |
549fdc |
#include <assert.h>
|
|
Packit |
549fdc |
#include <gnutls/gnutls.h>
|
|
Packit |
549fdc |
#include "utils.h"
|
|
Packit |
549fdc |
#include "eagain-common.h"
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* internal function */
|
|
Packit |
549fdc |
int _gnutls_server_name_set_raw(gnutls_session_t session,
|
|
Packit |
549fdc |
gnutls_server_name_type_t type,
|
|
Packit |
549fdc |
const void *name, size_t name_length);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
const char *side = NULL;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* if @host is NULL certificate check is skipped */
|
|
Packit |
549fdc |
static int
|
|
Packit |
549fdc |
_test_cli_serv(gnutls_certificate_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_certificate_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *serv_prio, const char *cli_prio,
|
|
Packit |
549fdc |
const char *host,
|
|
Packit |
549fdc |
void *priv, callback_func *client_cb, callback_func *server_cb,
|
|
Packit |
549fdc |
unsigned expect_verification_failure,
|
|
Packit |
549fdc |
unsigned require_cert,
|
|
Packit |
549fdc |
int serv_err,
|
|
Packit |
549fdc |
int cli_err)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
int exit_code = EXIT_SUCCESS;
|
|
Packit |
549fdc |
int ret;
|
|
Packit |
549fdc |
/* Server stuff. */
|
|
Packit |
549fdc |
gnutls_session_t server;
|
|
Packit |
549fdc |
int sret = GNUTLS_E_AGAIN;
|
|
Packit |
549fdc |
/* Client stuff. */
|
|
Packit |
549fdc |
gnutls_session_t client;
|
|
Packit |
549fdc |
int cret = GNUTLS_E_AGAIN;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* General init. */
|
|
Packit |
549fdc |
reset_buffers();
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* Init server */
|
|
Packit |
549fdc |
gnutls_init(&server, GNUTLS_SERVER);
|
|
Packit |
549fdc |
gnutls_credentials_set(server, GNUTLS_CRD_CERTIFICATE,
|
|
Packit |
549fdc |
server_cred);
|
|
Packit |
549fdc |
gnutls_priority_set_direct(server, serv_prio, NULL);
|
|
Packit |
549fdc |
gnutls_transport_set_push_function(server, server_push);
|
|
Packit |
549fdc |
gnutls_transport_set_pull_function(server, server_pull);
|
|
Packit |
549fdc |
gnutls_transport_set_ptr(server, server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (require_cert)
|
|
Packit |
549fdc |
gnutls_certificate_server_set_request(server, GNUTLS_CERT_REQUIRE);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_init(&client, GNUTLS_CLIENT);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (host) {
|
|
Packit |
549fdc |
if (strncmp(host, "raw:", 4) == 0) {
|
|
Packit |
549fdc |
assert(_gnutls_server_name_set_raw(client, GNUTLS_NAME_DNS, host+4, strlen(host+4))>=0);
|
|
Packit |
549fdc |
host += 4;
|
|
Packit |
549fdc |
} else {
|
|
Packit |
549fdc |
assert(gnutls_server_name_set(client, GNUTLS_NAME_DNS, host, strlen(host))>=0);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_credentials_set(client, GNUTLS_CRD_CERTIFICATE,
|
|
Packit |
549fdc |
client_cred);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_priority_set_direct(client, cli_prio, NULL);
|
|
Packit |
549fdc |
gnutls_transport_set_push_function(client, client_push);
|
|
Packit |
549fdc |
gnutls_transport_set_pull_function(client, client_pull);
|
|
Packit |
549fdc |
gnutls_transport_set_ptr(client, client);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (cli_err == 0 && serv_err == 0) {
|
|
Packit |
549fdc |
HANDSHAKE(client, server);
|
|
Packit |
549fdc |
} else {
|
|
Packit |
549fdc |
HANDSHAKE_EXPECT(client, server, cli_err, serv_err);
|
|
Packit |
549fdc |
goto cleanup;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* check the number of certificates received and verify */
|
|
Packit |
549fdc |
if (host) {
|
|
Packit |
549fdc |
gnutls_typed_vdata_st data[2];
|
|
Packit |
549fdc |
unsigned status;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
memset(data, 0, sizeof(data));
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
data[0].type = GNUTLS_DT_DNS_HOSTNAME;
|
|
Packit |
549fdc |
data[0].data = (void*)host;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
data[1].type = GNUTLS_DT_KEY_PURPOSE_OID;
|
|
Packit |
549fdc |
data[1].data = (void*)GNUTLS_KP_TLS_WWW_SERVER;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_certificate_verify_peers(client, data, 2, &status);
|
|
Packit |
549fdc |
if (ret < 0) {
|
|
Packit |
549fdc |
fail("could not verify certificate: %s\n", gnutls_strerror(ret));
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (expect_verification_failure && status != 0) {
|
|
Packit |
549fdc |
ret = status;
|
|
Packit |
549fdc |
goto cleanup;
|
|
Packit |
549fdc |
} else if (expect_verification_failure && status == 0) {
|
|
Packit |
549fdc |
fail("expected verification failure but verification succeeded!\n");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (status != 0) {
|
|
Packit |
549fdc |
gnutls_datum_t t;
|
|
Packit |
549fdc |
assert(gnutls_certificate_verification_status_print(status, GNUTLS_CRT_X509, &t, 0)>=0);
|
|
Packit |
549fdc |
fail("could not verify certificate for '%s': %.4x: %s\n", host, status, t.data);
|
|
Packit |
549fdc |
gnutls_free(t.data);
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* check gnutls_certificate_verify_peers3 */
|
|
Packit |
549fdc |
ret = gnutls_certificate_verify_peers3(client, host, &status);
|
|
Packit |
549fdc |
if (ret < 0) {
|
|
Packit |
549fdc |
fail("could not verify certificate: %s\n", gnutls_strerror(ret));
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (status != 0) {
|
|
Packit |
549fdc |
gnutls_datum_t t;
|
|
Packit |
549fdc |
assert(gnutls_certificate_verification_status_print(status, GNUTLS_CRT_X509, &t, 0)>=0);
|
|
Packit |
549fdc |
fail("could not verify certificate3: %.4x: %s\n", status, t.data);
|
|
Packit |
549fdc |
gnutls_free(t.data);
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = 0;
|
|
Packit |
549fdc |
cleanup:
|
|
Packit |
549fdc |
if (client_cb)
|
|
Packit |
549fdc |
client_cb(client, priv);
|
|
Packit |
549fdc |
if (server_cb)
|
|
Packit |
549fdc |
server_cb(server, priv);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_bye(client, GNUTLS_SHUT_RDWR);
|
|
Packit |
549fdc |
gnutls_bye(server, GNUTLS_SHUT_RDWR);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_deinit(client);
|
|
Packit |
549fdc |
gnutls_deinit(server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (debug > 0) {
|
|
Packit |
549fdc |
if (exit_code == 0)
|
|
Packit |
549fdc |
puts("Self-test successful");
|
|
Packit |
549fdc |
else
|
|
Packit |
549fdc |
puts("Self-test failed");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
return ret;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* An expected to succeed run */
|
|
Packit |
549fdc |
void
|
|
Packit |
549fdc |
test_cli_serv(gnutls_certificate_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_certificate_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *prio, const char *host,
|
|
Packit |
549fdc |
void *priv, callback_func *client_cb, callback_func *server_cb)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
_test_cli_serv(server_cred, client_cred, prio, prio, host, priv, client_cb, server_cb, 0, 0, 0, 0);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
int
|
|
Packit |
549fdc |
test_cli_serv_anon(gnutls_anon_server_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_anon_client_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *prio)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
int exit_code = EXIT_SUCCESS;
|
|
Packit |
549fdc |
int ret;
|
|
Packit |
549fdc |
/* Server stuff. */
|
|
Packit |
549fdc |
gnutls_session_t server;
|
|
Packit |
549fdc |
int sret = GNUTLS_E_AGAIN;
|
|
Packit |
549fdc |
/* Client stuff. */
|
|
Packit |
549fdc |
gnutls_session_t client;
|
|
Packit |
549fdc |
int cret = GNUTLS_E_AGAIN;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* General init. */
|
|
Packit |
549fdc |
reset_buffers();
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* Init server */
|
|
Packit |
549fdc |
gnutls_init(&server, GNUTLS_SERVER);
|
|
Packit |
549fdc |
gnutls_credentials_set(server, GNUTLS_CRD_ANON,
|
|
Packit |
549fdc |
server_cred);
|
|
Packit |
549fdc |
gnutls_priority_set_direct(server, prio, NULL);
|
|
Packit |
549fdc |
gnutls_transport_set_push_function(server, server_push);
|
|
Packit |
549fdc |
gnutls_transport_set_pull_function(server, server_pull);
|
|
Packit |
549fdc |
gnutls_transport_set_ptr(server, server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_init(&client, GNUTLS_CLIENT);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_credentials_set(client, GNUTLS_CRD_ANON,
|
|
Packit |
549fdc |
client_cred);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_priority_set_direct(client, prio, NULL);
|
|
Packit |
549fdc |
gnutls_transport_set_push_function(client, client_push);
|
|
Packit |
549fdc |
gnutls_transport_set_pull_function(client, client_pull);
|
|
Packit |
549fdc |
gnutls_transport_set_ptr(client, client);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
HANDSHAKE(client, server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = 0;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_bye(client, GNUTLS_SHUT_RDWR);
|
|
Packit |
549fdc |
gnutls_bye(server, GNUTLS_SHUT_RDWR);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_deinit(client);
|
|
Packit |
549fdc |
gnutls_deinit(server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (debug > 0) {
|
|
Packit |
549fdc |
if (exit_code == 0)
|
|
Packit |
549fdc |
puts("Self-test successful");
|
|
Packit |
549fdc |
else
|
|
Packit |
549fdc |
puts("Self-test failed");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
return ret;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
int
|
|
Packit |
549fdc |
test_cli_serv_psk(gnutls_psk_server_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_psk_client_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *prio)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
int exit_code = EXIT_SUCCESS;
|
|
Packit |
549fdc |
int ret;
|
|
Packit |
549fdc |
/* Server stuff. */
|
|
Packit |
549fdc |
gnutls_session_t server;
|
|
Packit |
549fdc |
int sret = GNUTLS_E_AGAIN;
|
|
Packit |
549fdc |
/* Client stuff. */
|
|
Packit |
549fdc |
gnutls_session_t client;
|
|
Packit |
549fdc |
int cret = GNUTLS_E_AGAIN;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* General init. */
|
|
Packit |
549fdc |
reset_buffers();
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* Init server */
|
|
Packit |
549fdc |
gnutls_init(&server, GNUTLS_SERVER);
|
|
Packit |
549fdc |
gnutls_credentials_set(server, GNUTLS_CRD_PSK,
|
|
Packit |
549fdc |
server_cred);
|
|
Packit |
549fdc |
gnutls_priority_set_direct(server, prio, NULL);
|
|
Packit |
549fdc |
gnutls_transport_set_push_function(server, server_push);
|
|
Packit |
549fdc |
gnutls_transport_set_pull_function(server, server_pull);
|
|
Packit |
549fdc |
gnutls_transport_set_ptr(server, server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_init(&client, GNUTLS_CLIENT);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_credentials_set(client, GNUTLS_CRD_PSK,
|
|
Packit |
549fdc |
client_cred);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
exit(1);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_priority_set_direct(client, prio, NULL);
|
|
Packit |
549fdc |
gnutls_transport_set_push_function(client, client_push);
|
|
Packit |
549fdc |
gnutls_transport_set_pull_function(client, client_pull);
|
|
Packit |
549fdc |
gnutls_transport_set_ptr(client, client);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
HANDSHAKE(client, server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = 0;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_bye(client, GNUTLS_SHUT_RDWR);
|
|
Packit |
549fdc |
gnutls_bye(server, GNUTLS_SHUT_RDWR);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_deinit(client);
|
|
Packit |
549fdc |
gnutls_deinit(server);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (debug > 0) {
|
|
Packit |
549fdc |
if (exit_code == 0)
|
|
Packit |
549fdc |
puts("Self-test successful");
|
|
Packit |
549fdc |
else
|
|
Packit |
549fdc |
puts("Self-test failed");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
return ret;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
void
|
|
Packit |
549fdc |
test_cli_serv_cert(gnutls_certificate_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_certificate_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *serv_prio, const char *cli_prio, const char *host)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
_test_cli_serv(server_cred, client_cred, serv_prio, cli_prio, host, NULL, NULL, NULL, 0, 1, 0, 0);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
void
|
|
Packit |
549fdc |
test_cli_serv_expect(gnutls_certificate_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_certificate_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *serv_prio, const char *cli_prio, const char *host,
|
|
Packit |
549fdc |
int serv_err, int cli_err)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
_test_cli_serv(server_cred, client_cred, serv_prio, cli_prio, host, NULL, NULL, NULL, 0, 0, serv_err, cli_err);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* An expected to fail verification run. Returns verification status */
|
|
Packit |
549fdc |
unsigned
|
|
Packit |
549fdc |
test_cli_serv_vf(gnutls_certificate_credentials_t server_cred,
|
|
Packit |
549fdc |
gnutls_certificate_credentials_t client_cred,
|
|
Packit |
549fdc |
const char *prio, const char *host)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
return _test_cli_serv(server_cred, client_cred, prio, prio, host, NULL, NULL, NULL, 1, 0, 0, 0);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
void print_dh_params_info(gnutls_session_t session)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
unsigned i;
|
|
Packit |
549fdc |
int ret;
|
|
Packit |
549fdc |
gnutls_datum_t pubkey, gen, prime;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_dh_get_prime_bits(session);
|
|
Packit |
549fdc |
if (ret < 512) {
|
|
Packit |
549fdc |
fail("client: too small prime size: %d\n", ret);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_dh_get_secret_bits(session);
|
|
Packit |
549fdc |
if (ret < 225) {
|
|
Packit |
549fdc |
fail("client: too small secret key size: %d\n", ret);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_dh_get_pubkey(session, &pubkey);
|
|
Packit |
549fdc |
if (ret < 0) {
|
|
Packit |
549fdc |
fail("error retrieving the public key\n");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (pubkey.size == 0) {
|
|
Packit |
549fdc |
fail("retrieved pubkey is empty!\n");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
printf("pubkey: \n");
|
|
Packit |
549fdc |
for (i=0;i
|
|
Packit |
549fdc |
printf("%.2x", (unsigned)pubkey.data[i]);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
printf("\n");
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_free(pubkey.data);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_dh_get_group(session, &gen, &prime);
|
|
Packit |
549fdc |
if (ret < 0 || gen.size == 0 || prime.size == 0) {
|
|
Packit |
549fdc |
fail("error retrieving the group info\n");
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
printf("prime: \n");
|
|
Packit |
549fdc |
for (i=0;i
|
|
Packit |
549fdc |
printf("%.2x", (unsigned)prime.data[i]);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
printf("\n");
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
printf("generator: \n");
|
|
Packit |
549fdc |
for (i=0;i
|
|
Packit |
549fdc |
printf("%.2x", (unsigned)gen.data[i]);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
printf("\n");
|
|
Packit |
549fdc |
gnutls_free(gen.data);
|
|
Packit |
549fdc |
gnutls_free(prime.data);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|