static int pub_encode_gost94(X509_PUBKEY *pub,const EVP_PKEY *pk)
	{
	ASN1_OBJECT *algobj = NULL;
	ASN1_OCTET_STRING *octet = NULL;
	void *pval = NULL;
	unsigned char *buf=NULL,*databuf,*sptr;
	int i,j,data_len,ret=0;
	int ptype = V_ASN1_UNDEF;
	DSA *dsa = EVP_PKEY_get0((EVP_PKEY *)pk);
	algobj = OBJ_nid2obj(EVP_PKEY_base_id(pk));
	if (pk->save_parameters)
		{
		ASN1_STRING *params = encode_gost_algor_params(pk);
		pval = params;
		ptype = V_ASN1_SEQUENCE;
		}
	data_len = BN_num_bytes(dsa->pub_key);
	databuf = OPENSSL_malloc(data_len);
	BN_bn2bin(dsa->pub_key,databuf);
	octet = ASN1_OCTET_STRING_new();
	ASN1_STRING_set(octet,NULL,data_len);
	sptr = ASN1_STRING_data(octet);
	for (i=0,j=data_len-1; i< data_len;i++,j--)
		{
		sptr[i]=databuf[j];
		}
	OPENSSL_free(databuf);
	ret = i2d_ASN1_OCTET_STRING(octet,&buf);
	ASN1_BIT_STRING_free(octet);
	if (ret <0)  return 0;
	return X509_PUBKEY_set0_param(pub,algobj,ptype,pval,buf,ret);
	}
['static int pub_encode_gost94(X509_PUBKEY *pub,const EVP_PKEY *pk)\n\t{\n\tASN1_OBJECT *algobj = NULL;\n\tASN1_OCTET_STRING *octet = NULL;\n\tvoid *pval = NULL;\n\tunsigned char *buf=NULL,*databuf,*sptr;\n\tint i,j,data_len,ret=0;\n\tint ptype = V_ASN1_UNDEF;\n\tDSA *dsa = EVP_PKEY_get0((EVP_PKEY *)pk);\n\talgobj = OBJ_nid2obj(EVP_PKEY_base_id(pk));\n\tif (pk->save_parameters)\n\t\t{\n\t\tASN1_STRING *params = encode_gost_algor_params(pk);\n\t\tpval = params;\n\t\tptype = V_ASN1_SEQUENCE;\n\t\t}\n\tdata_len = BN_num_bytes(dsa->pub_key);\n\tdatabuf = OPENSSL_malloc(data_len);\n\tBN_bn2bin(dsa->pub_key,databuf);\n\toctet = ASN1_OCTET_STRING_new();\n\tASN1_STRING_set(octet,NULL,data_len);\n\tsptr = ASN1_STRING_data(octet);\n\tfor (i=0,j=data_len-1; i< data_len;i++,j--)\n\t\t{\n\t\tsptr[i]=databuf[j];\n\t\t}\n\tOPENSSL_free(databuf);\n\tret = i2d_ASN1_OCTET_STRING(octet,&buf);\n\tASN1_BIT_STRING_free(octet);\n\tif (ret <0)  return 0;\n\treturn X509_PUBKEY_set0_param(pub,algobj,ptype,pval,buf,ret);\n\t}', 'void *EVP_PKEY_get0(EVP_PKEY *pkey)\n\t{\n\treturn pkey->pkey.ptr;\n\t}', 'int EVP_PKEY_base_id(const EVP_PKEY *pkey)\n\t{\n\treturn EVP_PKEY_type(pkey->type);\n\t}', 'int EVP_PKEY_type(int type)\n\t{\n\tint ret;\n\tconst EVP_PKEY_ASN1_METHOD *ameth;\n\tENGINE *e;\n\tameth = EVP_PKEY_asn1_find(&e, type);\n\tif (ameth)\n\t\tret = ameth->pkey_id;\n\telse\n\t\tret = NID_undef;\n#ifndef OPENSSL_NO_ENGINE\n\tif (e)\n\t\tENGINE_finish(e);\n#endif\n\treturn ret;\n\t}', 'const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type)\n\t{\n\tconst EVP_PKEY_ASN1_METHOD *t;\n\tfor (;;)\n\t\t{\n\t\tt = pkey_asn1_find(type);\n\t\tif (!t || !(t->pkey_flags & ASN1_PKEY_ALIAS))\n\t\t\tbreak;\n\t\ttype = t->pkey_base_id;\n\t\t}\n\tif (pe)\n\t\t{\n#ifndef OPENSSL_NO_ENGINE\n\t\tENGINE *e;\n\t\te = ENGINE_get_pkey_asn1_meth_engine(type);\n\t\tif (e)\n\t\t\t{\n\t\t\t*pe = e;\n\t\t\treturn ENGINE_get_pkey_asn1_meth(e, type);\n\t\t\t}\n#endif\n\t\t*pe = NULL;\n\t\t}\n\treturn t;\n\t}', 'static const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type)\n\t{\n\tEVP_PKEY_ASN1_METHOD tmp;\n\tconst EVP_PKEY_ASN1_METHOD *t = &tmp, **ret;\n\ttmp.pkey_id = type;\n\tif (app_methods)\n\t\t{\n\t\tint idx;\n\t\tidx = sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp);\n\t\tif (idx >= 0)\n\t\t\treturn sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx);\n\t\t}\n\tret = OBJ_bsearch_ameth(&t, standard_methods,\n\t\t\t  sizeof(standard_methods)\n\t\t\t  /sizeof(EVP_PKEY_ASN1_METHOD *));\n\tif (!ret || !*ret)\n\t\treturn NULL;\n\treturn *ret;\n\t}', 'int sk_find(_STACK *st, void *data)\n\t{\n\treturn internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH);\n\t}', 'static int internal_find(_STACK *st, void *data, int ret_val_options)\n\t{\n\tconst void * const *r;\n\tint i;\n\tif(st == NULL) return -1;\n\tif (st->comp == NULL)\n\t\t{\n\t\tfor (i=0; i<st->num; i++)\n\t\t\tif (st->data[i] == data)\n\t\t\t\treturn(i);\n\t\treturn(-1);\n\t\t}\n\tsk_sort(st);\n\tif (data == NULL) return(-1);\n\tr=OBJ_bsearch_ex_(&data,st->data,st->num,sizeof(void *),st->comp,\n\t\t\t  ret_val_options);\n\tif (r == NULL) return(-1);\n\treturn (int)((char **)r-st->data);\n\t}', 'void *sk_value(const _STACK *st, int i)\n{\n\tif(!st || (i < 0) || (i >= st->num)) return NULL;\n\treturn st->data[i];\n}', 'ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid)\n\t{\n\treturn engine_table_select(&pkey_asn1_meth_table, nid);\n\t}', 'ENGINE *engine_table_select(ENGINE_TABLE **table, int nid)\n#else\nENGINE *engine_table_select_tmp(ENGINE_TABLE **table, int nid, const char *f, int l)\n#endif\n\t{\n\tENGINE *ret = NULL;\n\tENGINE_PILE tmplate, *fnd=NULL;\n\tint initres, loop = 0;\n\tif(!(*table))\n\t\t{\n#ifdef ENGINE_TABLE_DEBUG\n\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, nothing "\n\t\t\t"registered!\\n", f, l, nid);\n#endif\n\t\treturn NULL;\n\t\t}\n\tERR_set_mark();\n\tCRYPTO_w_lock(CRYPTO_LOCK_ENGINE);\n\tif(!int_table_check(table, 0)) goto end;\n\ttmplate.nid = nid;\n\tfnd = lh_ENGINE_PILE_retrieve(&(*table)->piles, &tmplate);\n\tif(!fnd) goto end;\n\tif(fnd->funct && engine_unlocked_init(fnd->funct))\n\t\t{\n#ifdef ENGINE_TABLE_DEBUG\n\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, using "\n\t\t\t"ENGINE \'%s\' cached\\n", f, l, nid, fnd->funct->id);\n#endif\n\t\tret = fnd->funct;\n\t\tgoto end;\n\t\t}\n\tif(fnd->uptodate)\n\t\t{\n\t\tret = fnd->funct;\n\t\tgoto end;\n\t\t}\ntrynext:\n\tret = sk_ENGINE_value(fnd->sk, loop++);\n\tif(!ret)\n\t\t{\n#ifdef ENGINE_TABLE_DEBUG\n\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, no "\n\t\t\t\t"registered implementations would initialise\\n",\n\t\t\t\tf, l, nid);\n#endif\n\t\tgoto end;\n\t\t}\n\tif((ret->funct_ref > 0) || !(table_flags & ENGINE_TABLE_FLAG_NOINIT))\n\t\tinitres = engine_unlocked_init(ret);\n\telse\n\t\tinitres = 0;\n\tif(initres)\n\t\t{\n\t\tif((fnd->funct != ret) && engine_unlocked_init(ret))\n\t\t\t{\n\t\t\tif(fnd->funct)\n\t\t\t\tengine_unlocked_finish(fnd->funct, 0);\n\t\t\tfnd->funct = ret;\n#ifdef ENGINE_TABLE_DEBUG\n\t\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, "\n\t\t\t\t"setting default to \'%s\'\\n", f, l, nid, ret->id);\n#endif\n\t\t\t}\n#ifdef ENGINE_TABLE_DEBUG\n\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, using "\n\t\t\t\t"newly initialised \'%s\'\\n", f, l, nid, ret->id);\n#endif\n\t\tgoto end;\n\t\t}\n\tgoto trynext;\nend:\n\tif(fnd) fnd->uptodate = 1;\n#ifdef ENGINE_TABLE_DEBUG\n\tif(ret)\n\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, caching "\n\t\t\t\t"ENGINE \'%s\'\\n", f, l, nid, ret->id);\n\telse\n\t\tfprintf(stderr, "engine_table_dbg: %s:%d, nid=%d, caching "\n\t\t\t\t"\'no matching ENGINE\'\\n", f, l, nid);\n#endif\n\tCRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);\n\tERR_pop_to_mark();\n\treturn ret;\n\t}', 'ASN1_OBJECT *OBJ_nid2obj(int n)\n\t{\n\tADDED_OBJ ad,*adp;\n\tASN1_OBJECT ob;\n\tif ((n >= 0) && (n < NUM_NID))\n\t\t{\n\t\tif ((n != NID_undef) && (nid_objs[n].nid == NID_undef))\n\t\t\t{\n\t\t\tOBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID);\n\t\t\treturn(NULL);\n\t\t\t}\n\t\treturn((ASN1_OBJECT *)&(nid_objs[n]));\n\t\t}\n\telse if (added == NULL)\n\t\treturn(NULL);\n\telse\n\t\t{\n\t\tad.type=ADDED_NID;\n\t\tad.obj= &ob;\n\t\tob.nid=n;\n\t\tadp=lh_ADDED_OBJ_retrieve(added,&ad);\n\t\tif (adp != NULL)\n\t\t\treturn(adp->obj);\n\t\telse\n\t\t\t{\n\t\t\tOBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID);\n\t\t\treturn(NULL);\n\t\t\t}\n\t\t}\n\t}', 'void *lh_retrieve(_LHASH *lh, const void *data)\n\t{\n\tunsigned long hash;\n\tLHASH_NODE **rn;\n\tvoid *ret;\n\tlh->error=0;\n\trn=getrn(lh,data,&hash);\n\tif (*rn == NULL)\n\t\t{\n\t\tlh->num_retrieve_miss++;\n\t\treturn(NULL);\n\t\t}\n\telse\n\t\t{\n\t\tret= (*rn)->data;\n\t\tlh->num_retrieve++;\n\t\t}\n\treturn(ret);\n\t}', 'int BN_num_bits(const BIGNUM *a)\n\t{\n\tint i = a->top - 1;\n\tbn_check_top(a);\n\tif (BN_is_zero(a)) return 0;\n\treturn ((i*BN_BITS2) + BN_num_bits_word(a->d[i]));\n\t}', 'void *CRYPTO_malloc(int num, const char *file, int line)\n\t{\n\tvoid *ret = NULL;\n\tif (num <= 0) return NULL;\n\tallow_customize = 0;\n\tif (malloc_debug_func != NULL)\n\t\t{\n\t\tallow_customize_debug = 0;\n\t\tmalloc_debug_func(NULL, num, file, line, 0);\n\t\t}\n\tret = malloc_ex_func(num,file,line);\n#ifdef LEVITTE_DEBUG_MEM\n\tfprintf(stderr, "LEVITTE_DEBUG_MEM:         > 0x%p (%d)\\n", ret, num);\n#endif\n\tif (malloc_debug_func != NULL)\n\t\tmalloc_debug_func(ret, num, file, line, 1);\n#ifndef OPENSSL_CPUID_OBJ\n        if(ret && (num > 2048))\n\t{\textern unsigned char cleanse_ctr;\n                ((unsigned char *)ret)[0] = cleanse_ctr;\n\t}\n#endif\n\treturn ret;\n\t}', 'int BN_bn2bin(const BIGNUM *a, unsigned char *to)\n\t{\n\tint n,i;\n\tBN_ULONG l;\n\tbn_check_top(a);\n\tn=i=BN_num_bytes(a);\n\twhile (i--)\n\t\t{\n\t\tl=a->d[i/BN_BYTES];\n\t\t*(to++)=(unsigned char)(l>>(8*(i%BN_BYTES)))&0xff;\n\t\t}\n\treturn(n);\n\t}']