1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <openssl/err.h> 11e1051a39Sopenharmony_ci#include <openssl/ui.h> 12e1051a39Sopenharmony_ci#include <openssl/core_names.h> 13e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 14e1051a39Sopenharmony_ci#include "internal/passphrase.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_civoid ossl_pw_clear_passphrase_data(struct ossl_passphrase_data_st *data) 17e1051a39Sopenharmony_ci{ 18e1051a39Sopenharmony_ci if (data != NULL) { 19e1051a39Sopenharmony_ci if (data->type == is_expl_passphrase) 20e1051a39Sopenharmony_ci OPENSSL_clear_free(data->_.expl_passphrase.passphrase_copy, 21e1051a39Sopenharmony_ci data->_.expl_passphrase.passphrase_len); 22e1051a39Sopenharmony_ci ossl_pw_clear_passphrase_cache(data); 23e1051a39Sopenharmony_ci memset(data, 0, sizeof(*data)); 24e1051a39Sopenharmony_ci } 25e1051a39Sopenharmony_ci} 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_civoid ossl_pw_clear_passphrase_cache(struct ossl_passphrase_data_st *data) 28e1051a39Sopenharmony_ci{ 29e1051a39Sopenharmony_ci OPENSSL_clear_free(data->cached_passphrase, data->cached_passphrase_len); 30e1051a39Sopenharmony_ci data->cached_passphrase = NULL; 31e1051a39Sopenharmony_ci} 32e1051a39Sopenharmony_ci 33e1051a39Sopenharmony_ciint ossl_pw_set_passphrase(struct ossl_passphrase_data_st *data, 34e1051a39Sopenharmony_ci const unsigned char *passphrase, 35e1051a39Sopenharmony_ci size_t passphrase_len) 36e1051a39Sopenharmony_ci{ 37e1051a39Sopenharmony_ci if (!ossl_assert(data != NULL && passphrase != NULL)) { 38e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER); 39e1051a39Sopenharmony_ci return 0; 40e1051a39Sopenharmony_ci } 41e1051a39Sopenharmony_ci ossl_pw_clear_passphrase_data(data); 42e1051a39Sopenharmony_ci data->type = is_expl_passphrase; 43e1051a39Sopenharmony_ci data->_.expl_passphrase.passphrase_copy = 44e1051a39Sopenharmony_ci passphrase_len != 0 ? OPENSSL_memdup(passphrase, passphrase_len) 45e1051a39Sopenharmony_ci : OPENSSL_malloc(1); 46e1051a39Sopenharmony_ci if (data->_.expl_passphrase.passphrase_copy == NULL) { 47e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 48e1051a39Sopenharmony_ci return 0; 49e1051a39Sopenharmony_ci } 50e1051a39Sopenharmony_ci data->_.expl_passphrase.passphrase_len = passphrase_len; 51e1051a39Sopenharmony_ci return 1; 52e1051a39Sopenharmony_ci} 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_ciint ossl_pw_set_pem_password_cb(struct ossl_passphrase_data_st *data, 55e1051a39Sopenharmony_ci pem_password_cb *cb, void *cbarg) 56e1051a39Sopenharmony_ci{ 57e1051a39Sopenharmony_ci if (!ossl_assert(data != NULL && cb != NULL)) { 58e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER); 59e1051a39Sopenharmony_ci return 0; 60e1051a39Sopenharmony_ci } 61e1051a39Sopenharmony_ci ossl_pw_clear_passphrase_data(data); 62e1051a39Sopenharmony_ci data->type = is_pem_password; 63e1051a39Sopenharmony_ci data->_.pem_password.password_cb = cb; 64e1051a39Sopenharmony_ci data->_.pem_password.password_cbarg = cbarg; 65e1051a39Sopenharmony_ci return 1; 66e1051a39Sopenharmony_ci} 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ciint ossl_pw_set_ossl_passphrase_cb(struct ossl_passphrase_data_st *data, 69e1051a39Sopenharmony_ci OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg) 70e1051a39Sopenharmony_ci{ 71e1051a39Sopenharmony_ci if (!ossl_assert(data != NULL && cb != NULL)) { 72e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER); 73e1051a39Sopenharmony_ci return 0; 74e1051a39Sopenharmony_ci } 75e1051a39Sopenharmony_ci ossl_pw_clear_passphrase_data(data); 76e1051a39Sopenharmony_ci data->type = is_ossl_passphrase; 77e1051a39Sopenharmony_ci data->_.ossl_passphrase.passphrase_cb = cb; 78e1051a39Sopenharmony_ci data->_.ossl_passphrase.passphrase_cbarg = cbarg; 79e1051a39Sopenharmony_ci return 1; 80e1051a39Sopenharmony_ci} 81e1051a39Sopenharmony_ci 82e1051a39Sopenharmony_ciint ossl_pw_set_ui_method(struct ossl_passphrase_data_st *data, 83e1051a39Sopenharmony_ci const UI_METHOD *ui_method, void *ui_data) 84e1051a39Sopenharmony_ci{ 85e1051a39Sopenharmony_ci if (!ossl_assert(data != NULL && ui_method != NULL)) { 86e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER); 87e1051a39Sopenharmony_ci return 0; 88e1051a39Sopenharmony_ci } 89e1051a39Sopenharmony_ci ossl_pw_clear_passphrase_data(data); 90e1051a39Sopenharmony_ci data->type = is_ui_method; 91e1051a39Sopenharmony_ci data->_.ui_method.ui_method = ui_method; 92e1051a39Sopenharmony_ci data->_.ui_method.ui_method_data = ui_data; 93e1051a39Sopenharmony_ci return 1; 94e1051a39Sopenharmony_ci} 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_ciint ossl_pw_enable_passphrase_caching(struct ossl_passphrase_data_st *data) 97e1051a39Sopenharmony_ci{ 98e1051a39Sopenharmony_ci data->flag_cache_passphrase = 1; 99e1051a39Sopenharmony_ci return 1; 100e1051a39Sopenharmony_ci} 101e1051a39Sopenharmony_ci 102e1051a39Sopenharmony_ciint ossl_pw_disable_passphrase_caching(struct ossl_passphrase_data_st *data) 103e1051a39Sopenharmony_ci{ 104e1051a39Sopenharmony_ci data->flag_cache_passphrase = 0; 105e1051a39Sopenharmony_ci return 1; 106e1051a39Sopenharmony_ci} 107e1051a39Sopenharmony_ci 108e1051a39Sopenharmony_ci 109e1051a39Sopenharmony_ci/*- 110e1051a39Sopenharmony_ci * UI_METHOD processor. It differs from UI_UTIL_read_pw() like this: 111e1051a39Sopenharmony_ci * 112e1051a39Sopenharmony_ci * 1. It constructs a prompt on its own, based on |prompt_info|. 113e1051a39Sopenharmony_ci * 2. It allocates a buffer for password and verification on its own 114e1051a39Sopenharmony_ci * to compensate for NUL terminator in UI password strings. 115e1051a39Sopenharmony_ci * 3. It raises errors. 116e1051a39Sopenharmony_ci * 4. It reports back the length of the prompted pass phrase. 117e1051a39Sopenharmony_ci */ 118e1051a39Sopenharmony_cistatic int do_ui_passphrase(char *pass, size_t pass_size, size_t *pass_len, 119e1051a39Sopenharmony_ci const char *prompt_info, int verify, 120e1051a39Sopenharmony_ci const UI_METHOD *ui_method, void *ui_data) 121e1051a39Sopenharmony_ci{ 122e1051a39Sopenharmony_ci char *prompt = NULL, *ipass = NULL, *vpass = NULL; 123e1051a39Sopenharmony_ci int prompt_idx = -1, verify_idx = -1, res; 124e1051a39Sopenharmony_ci UI *ui = NULL; 125e1051a39Sopenharmony_ci int ret = 0; 126e1051a39Sopenharmony_ci 127e1051a39Sopenharmony_ci if (!ossl_assert(pass != NULL && pass_size != 0 && pass_len != NULL)) { 128e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER); 129e1051a39Sopenharmony_ci return 0; 130e1051a39Sopenharmony_ci } 131e1051a39Sopenharmony_ci 132e1051a39Sopenharmony_ci if ((ui = UI_new()) == NULL) { 133e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 134e1051a39Sopenharmony_ci return 0; 135e1051a39Sopenharmony_ci } 136e1051a39Sopenharmony_ci 137e1051a39Sopenharmony_ci if (ui_method != NULL) { 138e1051a39Sopenharmony_ci UI_set_method(ui, ui_method); 139e1051a39Sopenharmony_ci if (ui_data != NULL) 140e1051a39Sopenharmony_ci UI_add_user_data(ui, ui_data); 141e1051a39Sopenharmony_ci } 142e1051a39Sopenharmony_ci 143e1051a39Sopenharmony_ci /* Get an application constructed prompt */ 144e1051a39Sopenharmony_ci prompt = UI_construct_prompt(ui, "pass phrase", prompt_info); 145e1051a39Sopenharmony_ci if (prompt == NULL) { 146e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 147e1051a39Sopenharmony_ci goto end; 148e1051a39Sopenharmony_ci } 149e1051a39Sopenharmony_ci 150e1051a39Sopenharmony_ci /* Get a buffer for verification prompt */ 151e1051a39Sopenharmony_ci ipass = OPENSSL_zalloc(pass_size + 1); 152e1051a39Sopenharmony_ci if (ipass == NULL) { 153e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 154e1051a39Sopenharmony_ci goto end; 155e1051a39Sopenharmony_ci } 156e1051a39Sopenharmony_ci 157e1051a39Sopenharmony_ci prompt_idx = UI_add_input_string(ui, prompt, 158e1051a39Sopenharmony_ci UI_INPUT_FLAG_DEFAULT_PWD, 159e1051a39Sopenharmony_ci ipass, 0, pass_size) - 1; 160e1051a39Sopenharmony_ci if (prompt_idx < 0) { 161e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_UI_LIB); 162e1051a39Sopenharmony_ci goto end; 163e1051a39Sopenharmony_ci } 164e1051a39Sopenharmony_ci 165e1051a39Sopenharmony_ci if (verify) { 166e1051a39Sopenharmony_ci /* Get a buffer for verification prompt */ 167e1051a39Sopenharmony_ci vpass = OPENSSL_zalloc(pass_size + 1); 168e1051a39Sopenharmony_ci if (vpass == NULL) { 169e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 170e1051a39Sopenharmony_ci goto end; 171e1051a39Sopenharmony_ci } 172e1051a39Sopenharmony_ci verify_idx = UI_add_verify_string(ui, prompt, 173e1051a39Sopenharmony_ci UI_INPUT_FLAG_DEFAULT_PWD, 174e1051a39Sopenharmony_ci vpass, 0, pass_size, 175e1051a39Sopenharmony_ci ipass) - 1; 176e1051a39Sopenharmony_ci if (verify_idx < 0) { 177e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_UI_LIB); 178e1051a39Sopenharmony_ci goto end; 179e1051a39Sopenharmony_ci } 180e1051a39Sopenharmony_ci } 181e1051a39Sopenharmony_ci 182e1051a39Sopenharmony_ci switch (UI_process(ui)) { 183e1051a39Sopenharmony_ci case -2: 184e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERRUPTED_OR_CANCELLED); 185e1051a39Sopenharmony_ci break; 186e1051a39Sopenharmony_ci case -1: 187e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_UI_LIB); 188e1051a39Sopenharmony_ci break; 189e1051a39Sopenharmony_ci default: 190e1051a39Sopenharmony_ci res = UI_get_result_length(ui, prompt_idx); 191e1051a39Sopenharmony_ci if (res < 0) { 192e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_UI_LIB); 193e1051a39Sopenharmony_ci break; 194e1051a39Sopenharmony_ci } 195e1051a39Sopenharmony_ci *pass_len = (size_t)res; 196e1051a39Sopenharmony_ci memcpy(pass, ipass, *pass_len); 197e1051a39Sopenharmony_ci ret = 1; 198e1051a39Sopenharmony_ci break; 199e1051a39Sopenharmony_ci } 200e1051a39Sopenharmony_ci 201e1051a39Sopenharmony_ci end: 202e1051a39Sopenharmony_ci OPENSSL_clear_free(vpass, pass_size + 1); 203e1051a39Sopenharmony_ci OPENSSL_clear_free(ipass, pass_size + 1); 204e1051a39Sopenharmony_ci OPENSSL_free(prompt); 205e1051a39Sopenharmony_ci UI_free(ui); 206e1051a39Sopenharmony_ci return ret; 207e1051a39Sopenharmony_ci} 208e1051a39Sopenharmony_ci 209e1051a39Sopenharmony_ci/* Central pw prompting dispatcher */ 210e1051a39Sopenharmony_ciint ossl_pw_get_passphrase(char *pass, size_t pass_size, size_t *pass_len, 211e1051a39Sopenharmony_ci const OSSL_PARAM params[], int verify, 212e1051a39Sopenharmony_ci struct ossl_passphrase_data_st *data) 213e1051a39Sopenharmony_ci{ 214e1051a39Sopenharmony_ci const char *source = NULL; 215e1051a39Sopenharmony_ci size_t source_len = 0; 216e1051a39Sopenharmony_ci const char *prompt_info = NULL; 217e1051a39Sopenharmony_ci const UI_METHOD *ui_method = NULL; 218e1051a39Sopenharmony_ci UI_METHOD *allocated_ui_method = NULL; 219e1051a39Sopenharmony_ci void *ui_data = NULL; 220e1051a39Sopenharmony_ci const OSSL_PARAM *p = NULL; 221e1051a39Sopenharmony_ci int ret; 222e1051a39Sopenharmony_ci 223e1051a39Sopenharmony_ci /* Handle explicit and cached passphrases */ 224e1051a39Sopenharmony_ci 225e1051a39Sopenharmony_ci if (data->type == is_expl_passphrase) { 226e1051a39Sopenharmony_ci source = data->_.expl_passphrase.passphrase_copy; 227e1051a39Sopenharmony_ci source_len = data->_.expl_passphrase.passphrase_len; 228e1051a39Sopenharmony_ci } else if (data->flag_cache_passphrase && data->cached_passphrase != NULL) { 229e1051a39Sopenharmony_ci source = data->cached_passphrase; 230e1051a39Sopenharmony_ci source_len = data->cached_passphrase_len; 231e1051a39Sopenharmony_ci } 232e1051a39Sopenharmony_ci 233e1051a39Sopenharmony_ci if (source != NULL) { 234e1051a39Sopenharmony_ci if (source_len > pass_size) 235e1051a39Sopenharmony_ci source_len = pass_size; 236e1051a39Sopenharmony_ci memcpy(pass, source, source_len); 237e1051a39Sopenharmony_ci *pass_len = source_len; 238e1051a39Sopenharmony_ci return 1; 239e1051a39Sopenharmony_ci } 240e1051a39Sopenharmony_ci 241e1051a39Sopenharmony_ci /* Handle the is_ossl_passphrase case... that's pretty direct */ 242e1051a39Sopenharmony_ci 243e1051a39Sopenharmony_ci if (data->type == is_ossl_passphrase) { 244e1051a39Sopenharmony_ci OSSL_PASSPHRASE_CALLBACK *cb = data->_.ossl_passphrase.passphrase_cb; 245e1051a39Sopenharmony_ci void *cbarg = data->_.ossl_passphrase.passphrase_cbarg; 246e1051a39Sopenharmony_ci 247e1051a39Sopenharmony_ci ret = cb(pass, pass_size, pass_len, params, cbarg); 248e1051a39Sopenharmony_ci goto do_cache; 249e1051a39Sopenharmony_ci } 250e1051a39Sopenharmony_ci 251e1051a39Sopenharmony_ci /* Handle the is_pem_password and is_ui_method cases */ 252e1051a39Sopenharmony_ci 253e1051a39Sopenharmony_ci if ((p = OSSL_PARAM_locate_const(params, 254e1051a39Sopenharmony_ci OSSL_PASSPHRASE_PARAM_INFO)) != NULL) { 255e1051a39Sopenharmony_ci if (p->data_type != OSSL_PARAM_UTF8_STRING) { 256e1051a39Sopenharmony_ci ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_PASSED_INVALID_ARGUMENT, 257e1051a39Sopenharmony_ci "Prompt info data type incorrect"); 258e1051a39Sopenharmony_ci return 0; 259e1051a39Sopenharmony_ci } 260e1051a39Sopenharmony_ci prompt_info = p->data; 261e1051a39Sopenharmony_ci } 262e1051a39Sopenharmony_ci 263e1051a39Sopenharmony_ci if (data->type == is_pem_password) { 264e1051a39Sopenharmony_ci /* We use a UI wrapper for PEM */ 265e1051a39Sopenharmony_ci pem_password_cb *cb = data->_.pem_password.password_cb; 266e1051a39Sopenharmony_ci 267e1051a39Sopenharmony_ci ui_method = allocated_ui_method = 268e1051a39Sopenharmony_ci UI_UTIL_wrap_read_pem_callback(cb, verify); 269e1051a39Sopenharmony_ci ui_data = data->_.pem_password.password_cbarg; 270e1051a39Sopenharmony_ci 271e1051a39Sopenharmony_ci if (ui_method == NULL) { 272e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 273e1051a39Sopenharmony_ci return 0; 274e1051a39Sopenharmony_ci } 275e1051a39Sopenharmony_ci } else if (data->type == is_ui_method) { 276e1051a39Sopenharmony_ci ui_method = data->_.ui_method.ui_method; 277e1051a39Sopenharmony_ci ui_data = data->_.ui_method.ui_method_data; 278e1051a39Sopenharmony_ci } 279e1051a39Sopenharmony_ci 280e1051a39Sopenharmony_ci if (ui_method == NULL) { 281e1051a39Sopenharmony_ci ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_PASSED_INVALID_ARGUMENT, 282e1051a39Sopenharmony_ci "No password method specified"); 283e1051a39Sopenharmony_ci return 0; 284e1051a39Sopenharmony_ci } 285e1051a39Sopenharmony_ci 286e1051a39Sopenharmony_ci ret = do_ui_passphrase(pass, pass_size, pass_len, prompt_info, verify, 287e1051a39Sopenharmony_ci ui_method, ui_data); 288e1051a39Sopenharmony_ci 289e1051a39Sopenharmony_ci UI_destroy_method(allocated_ui_method); 290e1051a39Sopenharmony_ci 291e1051a39Sopenharmony_ci do_cache: 292e1051a39Sopenharmony_ci if (ret && data->flag_cache_passphrase) { 293e1051a39Sopenharmony_ci if (data->cached_passphrase == NULL 294e1051a39Sopenharmony_ci || *pass_len > data->cached_passphrase_len) { 295e1051a39Sopenharmony_ci void *new_cache = 296e1051a39Sopenharmony_ci OPENSSL_clear_realloc(data->cached_passphrase, 297e1051a39Sopenharmony_ci data->cached_passphrase_len, 298e1051a39Sopenharmony_ci *pass_len + 1); 299e1051a39Sopenharmony_ci 300e1051a39Sopenharmony_ci if (new_cache == NULL) { 301e1051a39Sopenharmony_ci OPENSSL_cleanse(pass, *pass_len); 302e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE); 303e1051a39Sopenharmony_ci return 0; 304e1051a39Sopenharmony_ci } 305e1051a39Sopenharmony_ci data->cached_passphrase = new_cache; 306e1051a39Sopenharmony_ci } 307e1051a39Sopenharmony_ci memcpy(data->cached_passphrase, pass, *pass_len); 308e1051a39Sopenharmony_ci data->cached_passphrase[*pass_len] = '\0'; 309e1051a39Sopenharmony_ci data->cached_passphrase_len = *pass_len; 310e1051a39Sopenharmony_ci } 311e1051a39Sopenharmony_ci 312e1051a39Sopenharmony_ci return ret; 313e1051a39Sopenharmony_ci} 314e1051a39Sopenharmony_ci 315e1051a39Sopenharmony_cistatic int ossl_pw_get_password(char *buf, int size, int rwflag, 316e1051a39Sopenharmony_ci void *userdata, const char *info) 317e1051a39Sopenharmony_ci{ 318e1051a39Sopenharmony_ci size_t password_len = 0; 319e1051a39Sopenharmony_ci OSSL_PARAM params[] = { 320e1051a39Sopenharmony_ci OSSL_PARAM_utf8_string(OSSL_PASSPHRASE_PARAM_INFO, NULL, 0), 321e1051a39Sopenharmony_ci OSSL_PARAM_END 322e1051a39Sopenharmony_ci }; 323e1051a39Sopenharmony_ci 324e1051a39Sopenharmony_ci params[0].data = (void *)info; 325e1051a39Sopenharmony_ci if (ossl_pw_get_passphrase(buf, (size_t)size, &password_len, params, 326e1051a39Sopenharmony_ci rwflag, userdata)) 327e1051a39Sopenharmony_ci return (int)password_len; 328e1051a39Sopenharmony_ci return -1; 329e1051a39Sopenharmony_ci} 330e1051a39Sopenharmony_ci 331e1051a39Sopenharmony_ciint ossl_pw_pem_password(char *buf, int size, int rwflag, void *userdata) 332e1051a39Sopenharmony_ci{ 333e1051a39Sopenharmony_ci return ossl_pw_get_password(buf, size, rwflag, userdata, "PEM"); 334e1051a39Sopenharmony_ci} 335e1051a39Sopenharmony_ci 336e1051a39Sopenharmony_ciint ossl_pw_pvk_password(char *buf, int size, int rwflag, void *userdata) 337e1051a39Sopenharmony_ci{ 338e1051a39Sopenharmony_ci return ossl_pw_get_password(buf, size, rwflag, userdata, "PVK"); 339e1051a39Sopenharmony_ci} 340e1051a39Sopenharmony_ci 341e1051a39Sopenharmony_ciint ossl_pw_passphrase_callback_enc(char *pass, size_t pass_size, 342e1051a39Sopenharmony_ci size_t *pass_len, 343e1051a39Sopenharmony_ci const OSSL_PARAM params[], void *arg) 344e1051a39Sopenharmony_ci{ 345e1051a39Sopenharmony_ci return ossl_pw_get_passphrase(pass, pass_size, pass_len, params, 1, arg); 346e1051a39Sopenharmony_ci} 347e1051a39Sopenharmony_ci 348e1051a39Sopenharmony_ciint ossl_pw_passphrase_callback_dec(char *pass, size_t pass_size, 349e1051a39Sopenharmony_ci size_t *pass_len, 350e1051a39Sopenharmony_ci const OSSL_PARAM params[], void *arg) 351e1051a39Sopenharmony_ci{ 352e1051a39Sopenharmony_ci return ossl_pw_get_passphrase(pass, pass_size, pass_len, params, 0, arg); 353e1051a39Sopenharmony_ci} 354