openssl/test/uitest.c
Richard Levitte 6a15d5b637 UI: fix uitest for VMS
- On VMS, apps/apps.c depends on apps/vms_term_sock.c, so add it to
  the build
- On VMS, apps/*.c are compiled with default symbol settings,
  i.e. uppercased and truncated symbols, which differs from test
  programs.  Make sure uitest.c knows that with a few pragmas.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/2218)
2017-01-12 15:23:15 +01:00

142 lines
3.1 KiB
C

/*
* Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <stdio.h>
#include <string.h>
#include <openssl/opensslconf.h>
#include <openssl/err.h>
/*
* We know that on VMS, the [.apps] object files are compiled with uppercased
* symbols. We must therefore follow suit, or there will be linking errors.
* Additionally, the VMS build does stdio via a socketpair.
*/
#ifdef __VMS
# pragma names save
# pragma names uppercase, truncated
# include "../apps/vms_term_sock.h"
#endif
#include "../apps/apps.h"
#ifdef __VMS
# pragma names restore
#endif
#include "testutil.h"
#include "test_main_custom.h"
/* apps/apps.c depend on these */
char *default_config_file = NULL;
BIO *bio_err = NULL;
#ifndef OPENSSL_NO_UI
# include <openssl/ui.h>
/* Old style PEM password callback */
static int test_pem_password_cb(char *buf, int size, int rwflag, void *userdata)
{
OPENSSL_strlcpy(buf, (char *)userdata, (size_t)size);
return 1;
}
/*
* Test wrapping old style PEM password callback in a UI method through the
* use of UI utility functions
*/
static int test_old()
{
UI_METHOD *ui_method = NULL;
UI *ui = NULL;
char defpass[] = "password";
char pass[16];
int ok = 0;
if ((ui_method =
UI_UTIL_wrap_read_pem_callback(test_pem_password_cb, 0)) == NULL
|| (ui = UI_new_method(ui_method)) == NULL)
goto err;
/* The wrapper passes the UI userdata as the callback userdata param */
UI_add_user_data(ui, defpass);
if (!UI_add_input_string(ui, "prompt", UI_INPUT_FLAG_DEFAULT_PWD,
pass, 0, sizeof(pass) - 1))
goto err;
switch (UI_process(ui)) {
case -2:
BIO_printf(bio_err, "test_old: UI process interrupted or cancelled\n");
/* fall through */
case -1:
goto err;
default:
break;
}
if (strcmp(pass, defpass) == 0)
ok = 1;
else
BIO_printf(bio_err, "test_old: password failure\n");
err:
if (!ok)
ERR_print_errors_fp(stderr);
UI_free(ui);
UI_destroy_method(ui_method);
return ok;
}
/* Test of UI. This uses the UI method defined in apps/apps.c */
static int test_new_ui()
{
PW_CB_DATA cb_data = {
"password",
"prompt"
};
char pass[16];
int ok = 0;
setup_ui_method();
if (password_callback(pass, sizeof(pass), 0, &cb_data) > 0
&& strcmp(pass, cb_data.password) == 0)
ok = 1;
else
BIO_printf(bio_err, "test_new: password failure\n");
if (!ok)
ERR_print_errors_fp(stderr);
destroy_ui_method();
return ok;
}
#endif
int test_main(int argc, char *argv[])
{
int ret;
bio_err = dup_bio_err(FORMAT_TEXT);
#ifndef OPENSSL_NO_UI
ADD_TEST(test_old);
ADD_TEST(test_new_ui);
#endif
ret = run_tests(argv[0]);
(void)BIO_flush(bio_err);
BIO_free(bio_err);
return ret;
}