| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2020-10-15 21:10:06 +08:00
										 |  |  |  * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:05:25 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |  * 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>
 | 
					
						
							| 
									
										
										
										
											2017-01-12 18:08:36 +08:00
										 |  |  | #include <openssl/opensslconf.h>
 | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | #include <openssl/err.h>
 | 
					
						
							| 
									
										
										
										
											2018-08-16 10:36:01 +08:00
										 |  |  | #include "apps_ui.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | #include "testutil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-01 18:14:37 +08:00
										 |  |  | #include <openssl/ui.h>
 | 
					
						
							| 
									
										
										
										
											2017-01-12 18:08:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | /* 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); | 
					
						
							| 
									
										
										
										
											2025-06-18 17:59:04 +08:00
										 |  |  |     return (int)strlen(buf); | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Test wrapping old style PEM password callback in a UI method through the | 
					
						
							|  |  |  |  * use of UI utility functions | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-08-16 05:39:03 +08:00
										 |  |  | static int test_old(void) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     UI_METHOD *ui_method = NULL; | 
					
						
							|  |  |  |     UI *ui = NULL; | 
					
						
							|  |  |  |     char defpass[] = "password"; | 
					
						
							|  |  |  |     char pass[16]; | 
					
						
							|  |  |  |     int ok = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 11:12:04 +08:00
										 |  |  |     if (!TEST_ptr(ui_method = | 
					
						
							| 
									
										
										
										
											2021-10-26 15:16:18 +08:00
										 |  |  |                   UI_UTIL_wrap_read_pem_callback(test_pem_password_cb, 0)) | 
					
						
							| 
									
										
										
										
											2017-04-12 11:12:04 +08:00
										 |  |  |             || !TEST_ptr(ui = UI_new_method(ui_method))) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* The wrapper passes the UI userdata as the callback userdata param */ | 
					
						
							|  |  |  |     UI_add_user_data(ui, defpass); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 00:02:37 +08:00
										 |  |  |     if (UI_add_input_string(ui, "prompt", UI_INPUT_FLAG_DEFAULT_PWD, | 
					
						
							|  |  |  |                              pass, 0, sizeof(pass) - 1) <= 0) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |         goto err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (UI_process(ui)) { | 
					
						
							|  |  |  |     case -2: | 
					
						
							| 
									
										
										
										
											2017-04-12 11:12:04 +08:00
										 |  |  |         TEST_info("test_old: UI process interrupted or cancelled"); | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |         /* fall through */ | 
					
						
							|  |  |  |     case -1: | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-12 11:12:04 +08:00
										 |  |  |     if (TEST_str_eq(pass, defpass)) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |         ok = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  err: | 
					
						
							|  |  |  |     UI_free(ui); | 
					
						
							|  |  |  |     UI_destroy_method(ui_method); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ok; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Test of UI.  This uses the UI method defined in apps/apps.c */ | 
					
						
							| 
									
										
										
										
											2017-08-16 05:39:03 +08:00
										 |  |  | static int test_new_ui(void) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     PW_CB_DATA cb_data = { | 
					
						
							|  |  |  |         "password", | 
					
						
							|  |  |  |         "prompt" | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     char pass[16]; | 
					
						
							|  |  |  |     int ok = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-04 16:11:02 +08:00
										 |  |  |     (void)setup_ui_method(); | 
					
						
							| 
									
										
										
										
											2017-04-12 11:12:04 +08:00
										 |  |  |     if (TEST_int_gt(password_callback(pass, sizeof(pass), 0, &cb_data), 0) | 
					
						
							|  |  |  |             && TEST_str_eq(pass, cb_data.password)) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  |         ok = 1; | 
					
						
							|  |  |  |     destroy_ui_method(); | 
					
						
							|  |  |  |     return ok; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  | int setup_tests(void) | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     ADD_TEST(test_old); | 
					
						
							|  |  |  |     ADD_TEST(test_new_ui); | 
					
						
							| 
									
										
										
										
											2017-07-18 09:48:27 +08:00
										 |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2017-01-11 07:13:59 +08:00
										 |  |  | } |