EVP_PKEY_derive(3) OpenSSL EVP_PKEY_derive(3) NNAAMMEE EVP_PKEY_derive_init, EVP_PKEY_derive_set_peer, EVP_PKEY_derive - derive public key algorithm shared secret. SSYYNNOOPPSSIISS #include int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx); int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer); int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen); DDEESSCCRRIIPPTTIIOONN The _E_V_P___P_K_E_Y___d_e_r_i_v_e___i_n_i_t_(_) function initializes a public key algorithm context using key ppkkeeyy for shared secret derivation. The _E_V_P___P_K_E_Y___d_e_r_i_v_e___s_e_t___p_e_e_r_(_) function sets the peer key: this will normally be a public key. The _E_V_P___P_K_E_Y___d_e_r_i_v_e_(_) derives a shared secret using ccttxx. If kkeeyy is NNUULLLL then the maximum size of the output buffer is written to the kkeeyylleenn parameter. If kkeeyy is not NNUULLLL then before the call the kkeeyylleenn parameter should contain the length of the kkeeyy buffer, if the call is successful the shared secret is written to kkeeyy and the amount of data written to kkeeyylleenn. NNOOTTEESS After the call to _E_V_P___P_K_E_Y___d_e_r_i_v_e___i_n_i_t_(_) algorithm specific control operations can be performed to set any appropriate parameters for the operation. The function _E_V_P___P_K_E_Y___d_e_r_i_v_e_(_) can be called more than once on the same context if several operations are performed using the same parameters. RREETTUURRNN VVAALLUUEESS _E_V_P___P_K_E_Y___d_e_r_i_v_e___i_n_i_t_(_) and _E_V_P___P_K_E_Y___d_e_r_i_v_e_(_) return 1 for success and 0 or a negative value for failure. In particular a return value of -2 indicates the operation is not supported by the public key algorithm. EEXXAAMMPPLLEE Derive shared secret (for example DH or EC keys): #include #include EVP_PKEY_CTX *ctx; unsigned char *skey; size_t skeylen; EVP_PKEY *pkey, *peerkey; /* NB: assumes pkey, peerkey have been already set up */ ctx = EVP_PKEY_CTX_new(pkey); if (!ctx) /* Error occurred */ if (EVP_PKEY_derive_init(ctx) <= 0) /* Error */ if (EVP_PKEY_derive_set_peer(ctx, peerkey) <= 0) /* Error */ /* Determine buffer length */ if (EVP_PKEY_derive(ctx, NULL, &skeylen) <= 0) /* Error */ skey = OPENSSL_malloc(skeylen); if (!skey) /* malloc failure */ if (EVP_PKEY_derive(ctx, skey, &skeylen) <= 0) /* Error */ /* Shared secret is skey bytes written to buffer skey */ SSEEEE AALLSSOO _E_V_P___P_K_E_Y___C_T_X___n_e_w(3), _E_V_P___P_K_E_Y___e_n_c_r_y_p_t(3), _E_V_P___P_K_E_Y___d_e_c_r_y_p_t(3), _E_V_P___P_K_E_Y___s_i_g_n(3), _E_V_P___P_K_E_Y___v_e_r_i_f_y(3), _E_V_P___P_K_E_Y___v_e_r_i_f_y___r_e_c_o_v_e_r(3), HHIISSTTOORRYY These functions were first added to OpenSSL 1.0.0. 1.0.2u 2019-12-20 EVP_PKEY_derive(3)