/* * 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 #include #include #include /* * 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 /* 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; }