@@ -48,6 +48,7 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
4848 OSSL_PARAM params [8 ];
4949 EVP_PKEY * pkey = NULL , * pkey_gen = NULL ;
5050 EVP_PKEY_CTX * pctx = NULL , * pctx_gen = NULL ;
51+ BIGNUM * p_bn = NULL ;
5152 BIGNUM * pub_key_gen = NULL , * priv_key_gen = NULL ;
5253 unsigned char * pub_ptr , * prv_ptr ;
5354 int pub_len , prv_len ;
@@ -64,7 +65,7 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
6465 ERL_NIF_TERM head , tail ;
6566
6667 head = argv [1 ];
67- if (!get_ossl_param_from_bin_in_list (env , "p" , & head , & params [i ++ ]) ) {
68+ if (!get_ossl_param_from_bin_in_list_x (env , "p" , & head , & params [i ++ ], & p_bn ) ) {
6869 ret = EXCP_BADARG_N (env , 1 , "Bad value of 'p'" );
6970 goto done ;
7071 }
@@ -91,9 +92,13 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
9192 ret = EXCP_BADARG_N (env , 3 , "Bad value of length element" );
9293 goto done ;
9394 }
94- else if (len )
95+ else if (len ) {
96+ if (len >= BN_num_bits (p_bn )) {
97+ len = BN_num_bits (p_bn ) - 1 ;
98+ }
9599 params [i ++ ] = OSSL_PARAM_construct_uint64 ("priv_len" , & len );
96-
100+ }
101+
97102 /* End of parameter fetching */
98103 params [i ++ ] = OSSL_PARAM_construct_end ();
99104
@@ -159,6 +164,7 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
159164 ret = enif_make_tuple2 (env , ret_pub , ret_prv );
160165
161166 done :
167+ if (p_bn ) BN_free (p_bn );
162168 if (pub_key_gen ) BN_free (pub_key_gen );
163169 if (priv_key_gen ) BN_free (priv_key_gen );
164170 if (pkey ) EVP_PKEY_free (pkey );
@@ -334,9 +340,9 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
334340 if ((bn_len = BN_num_bits (dh_p_shared )) < 0 )
335341 assign_goto (ret , err , EXCP_ERROR (env , "BN_num_bits < 0" ));
336342 dh_p_shared = NULL ; /* dh_params owns the reference */
337- if (len >= (size_t )bn_len )
338- assign_goto ( ret , err , EXCP_ERROR_N ( env , 3 , "Too big length" )) ;
339-
343+ if (len >= (size_t )bn_len ) {
344+ len = bn_len - 1 ;
345+ }
340346 if (!DH_set_length (dh_params , (long )len ))
341347 assign_goto (ret , err , EXCP_ERROR_N (env , 3 , "The length is not accepted" ));
342348 }
0 commit comments