static int ubsec_dh_generate_key(DH *dh)
        {
        int      ret               = 0,
                 random_bits       = 0,
                 pub_key_len       = 0,
                 priv_key_len      = 0,
                 fd;
        BIGNUM   *pub_key          = NULL;
        BIGNUM   *priv_key         = NULL;
        if (dh->priv_key == NULL)
                {
                priv_key = BN_new();
                if (priv_key == NULL) goto err;
                priv_key_len = BN_num_bits(dh->p);
                bn_wexpand(priv_key, dh->p->top);
                do
                        if (!BN_rand_range(priv_key, dh->p)) goto err;
                while (BN_is_zero(priv_key));
                random_bits = BN_num_bits(priv_key);
                }
        else
                {
                priv_key = dh->priv_key;
                }
        if (dh->pub_key == NULL)
                {
                pub_key = BN_new();
                pub_key_len = BN_num_bits(dh->p);
                bn_wexpand(pub_key, dh->p->top);
                if(pub_key == NULL) goto err;
                }
        else
                {
                pub_key = dh->pub_key;
                }
        if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0)
                {
                const DH_METHOD *meth;
                UBSECerr(UBSEC_F_UBSEC_DH_GENERATE_KEY, UBSEC_R_UNIT_FAILURE);
                meth = DH_OpenSSL();
                ret = meth->generate_key(dh);
                goto err;
                }
        if (p_UBSEC_diffie_hellman_generate_ioctl(fd,
                                                  (unsigned char *)priv_key->d, &priv_key_len,
                                                  (unsigned char *)pub_key->d,  &pub_key_len,
                                                  (unsigned char *)dh->g->d, BN_num_bits(dh->g),
                                                  (unsigned char *)dh->p->d, BN_num_bits(dh->p),
                                                  0, 0, random_bits) != 0)
                {
                const DH_METHOD *meth;
                UBSECerr(UBSEC_F_UBSEC_DH_GENERATE_KEY, UBSEC_R_REQUEST_FAILED);
                p_UBSEC_ubsec_close(fd);
                meth = DH_OpenSSL();
                ret = meth->generate_key(dh);
                goto err;
                }
        p_UBSEC_ubsec_close(fd);
        dh->pub_key = pub_key;
        dh->pub_key->top = (pub_key_len + BN_BITS2-1) / BN_BITS2;
        dh->priv_key = priv_key;
        dh->priv_key->top = (priv_key_len + BN_BITS2-1) / BN_BITS2;
        ret = 1;
err:
        return ret;
        }
['static int ubsec_dh_generate_key(DH *dh)\n        {\n        int      ret               = 0,\n                 random_bits       = 0,\n                 pub_key_len       = 0,\n                 priv_key_len      = 0,\n                 fd;\n        BIGNUM   *pub_key          = NULL;\n        BIGNUM   *priv_key         = NULL;\n        if (dh->priv_key == NULL)\n                {\n                priv_key = BN_new();\n                if (priv_key == NULL) goto err;\n                priv_key_len = BN_num_bits(dh->p);\n                bn_wexpand(priv_key, dh->p->top);\n                do\n                        if (!BN_rand_range(priv_key, dh->p)) goto err;\n                while (BN_is_zero(priv_key));\n                random_bits = BN_num_bits(priv_key);\n                }\n        else\n                {\n                priv_key = dh->priv_key;\n                }\n        if (dh->pub_key == NULL)\n                {\n                pub_key = BN_new();\n                pub_key_len = BN_num_bits(dh->p);\n                bn_wexpand(pub_key, dh->p->top);\n                if(pub_key == NULL) goto err;\n                }\n        else\n                {\n                pub_key = dh->pub_key;\n                }\n        if ((fd = p_UBSEC_ubsec_open(UBSEC_KEY_DEVICE_NAME)) <= 0)\n                {\n                const DH_METHOD *meth;\n                UBSECerr(UBSEC_F_UBSEC_DH_GENERATE_KEY, UBSEC_R_UNIT_FAILURE);\n                meth = DH_OpenSSL();\n                ret = meth->generate_key(dh);\n                goto err;\n                }\n        if (p_UBSEC_diffie_hellman_generate_ioctl(fd,\n                                                  (unsigned char *)priv_key->d, &priv_key_len,\n                                                  (unsigned char *)pub_key->d,  &pub_key_len,\n                                                  (unsigned char *)dh->g->d, BN_num_bits(dh->g),\n                                                  (unsigned char *)dh->p->d, BN_num_bits(dh->p),\n                                                  0, 0, random_bits) != 0)\n                {\n                const DH_METHOD *meth;\n                UBSECerr(UBSEC_F_UBSEC_DH_GENERATE_KEY, UBSEC_R_REQUEST_FAILED);\n                p_UBSEC_ubsec_close(fd);\n                meth = DH_OpenSSL();\n                ret = meth->generate_key(dh);\n                goto err;\n                }\n        p_UBSEC_ubsec_close(fd);\n        dh->pub_key = pub_key;\n        dh->pub_key->top = (pub_key_len + BN_BITS2-1) / BN_BITS2;\n        dh->priv_key = priv_key;\n        dh->priv_key->top = (priv_key_len + BN_BITS2-1) / BN_BITS2;\n        ret = 1;\nerr:\n        return ret;\n        }', 'BIGNUM *BN_new(void)\n\t{\n\tBIGNUM *ret;\n\tif ((ret=(BIGNUM *)OPENSSL_malloc(sizeof(BIGNUM))) == NULL)\n\t\t{\n\t\tBNerr(BN_F_BN_NEW,ERR_R_MALLOC_FAILURE);\n\t\treturn(NULL);\n\t\t}\n\tret->flags=BN_FLG_MALLOCED;\n\tret->top=0;\n\tret->neg=0;\n\tret->dmax=0;\n\tret->d=NULL;\n\tbn_check_top(ret);\n\treturn(ret);\n\t}', 'void *CRYPTO_malloc(int num, const char *file, int line)\n\t{\n\tvoid *ret = NULL;\n\textern unsigned char cleanse_ctr;\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        if(ret && (num > 2048))\n                ((unsigned char *)ret)[0] = cleanse_ctr;\n\treturn ret;\n\t}', 'void ERR_put_error(int lib, int func, int reason, const char *file,\n\t     int line)\n\t{\n\tERR_STATE *es;\n#ifdef _OSD_POSIX\n\tif (strncmp(file,"*POSIX(", sizeof("*POSIX(")-1) == 0) {\n\t\tchar *end;\n\t\tfile += sizeof("*POSIX(")-1;\n\t\tend = &file[strlen(file)-1];\n\t\tif (*end == \')\')\n\t\t\t*end = \'\\0\';\n\t\tif ((end = strrchr(file, \'/\')) != NULL)\n\t\t\tfile = &end[1];\n\t}\n#endif\n\tes=ERR_get_state();\n\tes->top=(es->top+1)%ERR_NUM_ERRORS;\n\tif (es->top == es->bottom)\n\t\tes->bottom=(es->bottom+1)%ERR_NUM_ERRORS;\n\tes->err_flags[es->top]=0;\n\tes->err_buffer[es->top]=ERR_PACK(lib,func,reason);\n\tes->err_file[es->top]=file;\n\tes->err_line[es->top]=line;\n\terr_clear_data(es,es->top);\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}']