@@ -331,33 +331,55 @@ static int gost_engine_destroy(ENGINE* e) {
331331 * Following is the glue that populates the ENGINE structure and that
332332 * binds it to OpenSSL libraries
333333 */
334-
335334static GOST_NID_JOB * missing_NIDs [] = {
336335 & kuznyechik_mgm_NID ,
337336 & magma_mgm_NID ,
338337};
339338
339+ static int create_new_nid_for_gost_nid_job (GOST_NID_JOB * job ) {
340+ int nid = OBJ_new_nid (1 );
341+ ASN1_OBJECT * obj =
342+ ASN1_OBJECT_create (nid , NULL , 0 , job -> sn , job -> ln );
343+
344+ if (!obj || OBJ_add_object (obj ) == NID_undef ) {
345+ OPENSSL_free (obj );
346+ return 0 ;
347+ }
348+
349+ job -> asn1 = obj ;
350+ job -> callback (nid );
351+
352+ return 1 ;
353+ }
354+
340355static int create_NIDs () {
341- int i ;
342- int new_nid = OBJ_new_nid ( OSSL_NELEM ( missing_NIDs ));
356+ int i , nid ;
357+
343358 for (i = 0 ; i < OSSL_NELEM (missing_NIDs ); i ++ ) {
344359 GOST_NID_JOB * job = missing_NIDs [i ];
345- ASN1_OBJECT * obj =
346- ASN1_OBJECT_create (new_nid + i , NULL , 0 , job -> sn , job -> ln );
347- job -> asn1 = obj ;
348- if (!obj || OBJ_add_object (obj ) == NID_undef ) {
349- OPENSSL_free (obj );
360+
361+ nid = OBJ_sn2nid (job -> sn );
362+ if (nid != NID_undef ) {
363+ job -> callback (nid );
364+ continue ;
365+ }
366+
367+ if (!create_new_nid_for_gost_nid_job (job )) {
350368 return 0 ;
351369 }
352- (* missing_NIDs [i ]-> callback )(new_nid + i );
353370 }
354371 return 1 ;
355372}
356373
357- static void free_NIDs () {
374+ static void free_NIDs (void ) {
358375 int i ;
376+
359377 for (i = 0 ; i < OSSL_NELEM (missing_NIDs ); i ++ ) {
360- ASN1_OBJECT_free (missing_NIDs [i ]-> asn1 );
378+ GOST_NID_JOB * job = missing_NIDs [i ];
379+ if (job -> asn1 ) {
380+ ASN1_OBJECT_free (job -> asn1 );
381+ job -> asn1 = NULL ;
382+ }
361383 }
362384}
363385
0 commit comments