@@ -685,21 +685,26 @@ static int wp_dh_get_params_encoded_public_key(wp_Dh* dh, OSSL_PARAM params[])
685685
686686 p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY );
687687 if (p != NULL ) {
688- size_t outLen = mp_unsigned_bin_size (& dh -> key .p );
688+ if (p -> data_type != OSSL_PARAM_OCTET_STRING ) {
689+ ok = 0 ;
690+ }
691+ if (ok ) {
692+ size_t outLen = mp_unsigned_bin_size (& dh -> key .p );
689693
690- if (p -> data != NULL ) {
691- if (p -> data_size < outLen ) {
692- ok = 0 ;
693- }
694- if (ok ) {
695- unsigned char * data = p -> data ;
696- size_t padSz = outLen - dh -> pubSz ;
697- /* Front pad with zeros. */
698- XMEMSET (data , 0 , padSz );
699- XMEMCPY (data + padSz , dh -> pub , dh -> pubSz );
694+ if (p -> data != NULL ) {
695+ if (p -> data_size < outLen ) {
696+ ok = 0 ;
697+ }
698+ if (ok ) {
699+ unsigned char * data = p -> data ;
700+ size_t padSz = outLen - dh -> pubSz ;
701+ /* Front pad with zeros. */
702+ XMEMSET (data , 0 , padSz );
703+ XMEMCPY (data + padSz , dh -> pub , dh -> pubSz );
704+ }
700705 }
706+ p -> return_size = outLen ;
701707 }
702- p -> return_size = outLen ;
703708 }
704709
705710 WOLFPROV_LEAVE (WP_LOG_KE , __FILE__ ":" WOLFPROV_STRINGIZE (__LINE__ ), ok );
@@ -719,35 +724,107 @@ static int wp_dh_get_params(wp_Dh* dh, OSSL_PARAM params[])
719724 int ok = 1 ;
720725 OSSL_PARAM * p ;
721726
722- p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_MAX_SIZE );
723- if ((p != NULL ) && !OSSL_PARAM_set_int (p ,
724- mp_unsigned_bin_size (& dh -> key .p ))) {
725- ok = 0 ;
727+ if (ok ) {
728+ p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_MAX_SIZE );
729+ if (p != NULL ) {
730+ if (!OSSL_PARAM_set_uint (p , mp_unsigned_bin_size (& dh -> key .p ))) {
731+ ok = 0 ;
732+ }
733+ }
726734 }
727735 if (ok ) {
728736 p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_BITS );
729- if ((p != NULL ) && !OSSL_PARAM_set_int (p , dh -> bits )) {
730- ok = 0 ;
737+ if (p != NULL ) {
738+ if (!OSSL_PARAM_set_int (p , dh -> bits )) {
739+ ok = 0 ;
740+ }
731741 }
732742 }
733743 if (ok ) {
734744 p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_SECURITY_BITS );
735- if ((p != NULL ) && (!OSSL_PARAM_set_int (p ,
736- wp_dh_get_security_bits (dh )))) {
737- ok = 0 ;
745+ if (p != NULL ) {
746+ if (!OSSL_PARAM_set_int (p , wp_dh_get_security_bits (dh ))) {
747+ ok = 0 ;
748+ }
738749 }
739750 }
740- if (ok && (!wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_P ,
741- & dh -> key .p , 1 ))) {
742- ok = 0 ;
751+ if (ok ) {
752+ p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_FFC_P );
753+ if (p != NULL ) {
754+ /* When buffer is NULL, return the size irrespective of type */
755+ if (p -> data == NULL ) {
756+ ok = wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_P , & dh -> key .g , 1 );
757+ }
758+ /* When buffer is non-NULL, type must be int or uint */
759+ else
760+ if (p -> data_type == OSSL_PARAM_INTEGER ||
761+ p -> data_type == OSSL_PARAM_UNSIGNED_INTEGER ) {
762+ ok = wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_P , & dh -> key .p , 1 );
763+ }
764+ else {
765+ ok = 0 ;
766+ }
767+ }
743768 }
744- if (ok && (!wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_G ,
745- & dh -> key .g , 1 ))) {
746- ok = 0 ;
769+ if (ok ) {
770+ p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_FFC_G );
771+ if (p != NULL ) {
772+ /* When buffer is NULL, return the size irrespective of type */
773+ if (p -> data == NULL ) {
774+ ok = wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_G , & dh -> key .g , 1 );
775+ }
776+ /* When buffer is non-NULL, type must be int or uint */
777+ else if (p -> data_type == OSSL_PARAM_INTEGER ||
778+ p -> data_type == OSSL_PARAM_UNSIGNED_INTEGER ) {
779+ ok = wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_G , & dh -> key .g , 1 );
780+ }
781+ else {
782+ ok = 0 ;
783+ }
784+ }
747785 }
748- if (ok && (!wp_params_set_octet_string_be (params , OSSL_PKEY_PARAM_PUB_KEY ,
749- dh -> pub , dh -> pubSz ))) {
750- ok = 0 ;
786+ if (ok ) {
787+ p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_FFC_Q );
788+ if (p != NULL ) {
789+ /* OSSL does not check the type */
790+ ok = wp_params_set_mp (params , OSSL_PKEY_PARAM_FFC_Q , & dh -> key .q , 1 );
791+ }
792+ }
793+ if (ok ) {
794+ p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_PUB_KEY );
795+ if (p != NULL ) {
796+ if (p -> data == NULL ) {
797+ p -> return_size = dh -> pubSz ;
798+ }
799+ else {
800+ /* return_size is set within this function */
801+ ok = wp_params_set_octet_string_be (params , OSSL_PKEY_PARAM_PUB_KEY ,
802+ dh -> pub , dh -> pubSz );
803+ }
804+ }
805+ }
806+ if (ok ) {
807+ p = OSSL_PARAM_locate (params , OSSL_PKEY_PARAM_PRIV_KEY );
808+ if (p != NULL ) {
809+ if (p -> data == NULL ) {
810+ p -> return_size = dh -> pubSz ;
811+ }
812+ else if (p -> data_type == OSSL_PARAM_UNSIGNED_INTEGER ) {
813+ if (p -> data_size < dh -> privSz ) {
814+ ok = 0 ;
815+ }
816+ else {
817+ /* OSSL returns a BIGNUM, but we copy raw bytes*/
818+ XMEMCPY (p -> data , dh -> priv , dh -> privSz );
819+ p -> return_size = dh -> privSz ;
820+ }
821+ }
822+ else {
823+ /* return_size is set within this function */
824+ ok = wp_params_set_octet_string_be (params , OSSL_PKEY_PARAM_PRIV_KEY ,
825+ dh -> priv , dh -> privSz );
826+ }
827+ }
751828 }
752829 if (ok && (!wp_params_set_octet_string_be (params , OSSL_PKEY_PARAM_PRIV_KEY ,
753830 dh -> priv , dh -> privSz ))) {
0 commit comments