apps/rsa.c:342: error: INTEGER_OVERFLOW_L2
  ([0, +oo] - 1):unsigned64 by call to `RSA_check_key`.
Showing all 12 steps of the trace


apps/rsa.c:336:3: Call
334.   		{
335.   		BIO_printf(out,"Modulus=");
336.   		BN_print(out,rsa->n);
         ^
337.   		BIO_printf(out,"\n");
338.   		}

crypto/bn/bn_print.c:334:1: Parameter `a->top`
  332.   #endif
  333.   
  334. > int BN_print(BIO *bp, const BIGNUM *a)
  335.   	{
  336.   	int i,j,v,z=0;

apps/rsa.c:342:11: Call
340.   	if (check)
341.   		{
342.   		int r = RSA_check_key(rsa);
                 ^
343.   
344.   		if (r == 1)

crypto/rsa/rsa_chk.c:56:1: Parameter `key->d->top`
  54.   
  55.   
  56. > int RSA_check_key(const RSA *key)
  57.   	{
  58.   	BIGNUM *i, *j, *k, *l, *m;

crypto/rsa/rsa_chk.c:137:7: Call
  135.   		if (!r) { ret = -1; goto err; }
  136.   
  137.   		r = BN_mod(j, key->d, i, ctx);
               ^
  138.   		if (!r) { ret = -1; goto err; }
  139.   

crypto/bn/bn_div.c:181:1: Parameter `num->top`
    179.   static int BN_div_no_branch(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num,
    180.           const BIGNUM *divisor, BN_CTX *ctx);
    181. > int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,
    182.   	   BN_CTX *ctx)
    183.   	{

crypto/bn/bn_div.c:204:10: Call
    202.   	if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0))
    203.   		{
    204.   		return BN_div_no_branch(dv, rm, num, divisor, ctx);
                    ^
    205.   		}
    206.   

crypto/bn/bn_div.c:426:1: Parameter `num->top`
      424.    * branches that may leak sensitive information.
      425.    */
      426. > static int BN_div_no_branch(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, 
      427.   	const BIGNUM *divisor, BN_CTX *ctx)
      428.   	{

crypto/bn/bn_div.c:460:8: Call
      458.   	sdiv->neg=0;
      459.   	norm_shift+=BN_BITS2;
      460.   	if (!(BN_lshift(snum,num,norm_shift))) goto err;
                    ^
      461.   	snum->neg=0;
      462.   

crypto/bn/bn_shift.c:132:1: <LHS trace>
130.   	}
131.   
132. > int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
133.   	{
134.   	int i,nw,lb,rb;

crypto/bn/bn_shift.c:132:1: Parameter `a->top`
        130.   	}
        131.   
        132. > int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
        133.   	{
        134.   	int i,nw,lb,rb;

crypto/bn/bn_shift.c:150:8: Binary operation: ([0, +oo] - 1):unsigned64 by call to `RSA_check_key` 
        148.   	t[a->top+nw]=0;
        149.   	if (lb == 0)
        150.   		for (i=a->top-1; i>=0; i--)
                      ^
        151.   			t[nw+i]=f[i];
        152.   	else

int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
	{
	int i,nw,lb,rb;
	BN_ULONG *t,*f;
	BN_ULONG l;
	bn_check_top(r);
	bn_check_top(a);
	r->neg=a->neg;
	nw=n/BN_BITS2;
	if (bn_wexpand(r,a->top+nw+1) == NULL) return(0);
	lb=n%BN_BITS2;
	rb=BN_BITS2-lb;
	f=a->d;
	t=r->d;
	t[a->top+nw]=0;
	if (lb == 0)
		for (i=a->top-1; i>=0; i--)
			t[nw+i]=f[i];
	else
		for (i=a->top-1; i>=0; i--)
			{
			l=f[i];
			t[nw+i+1]|=(l>>rb)&BN_MASK2;
			t[nw+i]=(l<<lb)&BN_MASK2;
			}
	memset(t,0,nw*sizeof(t[0]));
	r->top=a->top+nw+1;
	bn_correct_top(r);
	bn_check_top(r);
	return(1);
	}
['int MAIN(int argc, char **argv)\n\t{\n\tENGINE *e = NULL;\n\tint ret=1;\n\tRSA *rsa=NULL;\n\tint i,badops=0, sgckey=0;\n\tconst EVP_CIPHER *enc=NULL;\n\tBIO *out=NULL;\n\tint informat,outformat,text=0,check=0,noout=0;\n\tint pubin = 0, pubout = 0;\n\tchar *infile,*outfile,*prog;\n\tchar *passargin = NULL, *passargout = NULL;\n\tchar *passin = NULL, *passout = NULL;\n#ifndef OPENSSL_NO_ENGINE\n\tchar *engine=NULL;\n#endif\n\tint modulus=0;\n\tint pvk_encr = 2;\n\tapps_startup();\n\tif (bio_err == NULL)\n\t\tif ((bio_err=BIO_new(BIO_s_file())) != NULL)\n\t\t\tBIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);\n\tif (!load_config(bio_err, NULL))\n\t\tgoto end;\n\tinfile=NULL;\n\toutfile=NULL;\n\tinformat=FORMAT_PEM;\n\toutformat=FORMAT_PEM;\n\tprog=argv[0];\n\targc--;\n\targv++;\n\twhile (argc >= 1)\n\t\t{\n\t\tif \t(strcmp(*argv,"-inform") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tinformat=str2fmt(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-outform") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\toutformat=str2fmt(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-in") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tinfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-out") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\toutfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-passin") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tpassargin= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-passout") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tpassargout= *(++argv);\n\t\t\t}\n#ifndef OPENSSL_NO_ENGINE\n\t\telse if (strcmp(*argv,"-engine") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tengine= *(++argv);\n\t\t\t}\n#endif\n\t\telse if (strcmp(*argv,"-sgckey") == 0)\n\t\t\tsgckey=1;\n\t\telse if (strcmp(*argv,"-pubin") == 0)\n\t\t\tpubin=1;\n\t\telse if (strcmp(*argv,"-pubout") == 0)\n\t\t\tpubout=1;\n\t\telse if (strcmp(*argv,"-RSAPublicKey_in") == 0)\n\t\t\tpubin = 2;\n\t\telse if (strcmp(*argv,"-RSAPublicKey_out") == 0)\n\t\t\tpubout = 2;\n\t\telse if (strcmp(*argv,"-pvk-strong") == 0)\n\t\t\tpvk_encr=2;\n\t\telse if (strcmp(*argv,"-pvk-weak") == 0)\n\t\t\tpvk_encr=1;\n\t\telse if (strcmp(*argv,"-pvk-none") == 0)\n\t\t\tpvk_encr=0;\n\t\telse if (strcmp(*argv,"-noout") == 0)\n\t\t\tnoout=1;\n\t\telse if (strcmp(*argv,"-text") == 0)\n\t\t\ttext=1;\n\t\telse if (strcmp(*argv,"-modulus") == 0)\n\t\t\tmodulus=1;\n\t\telse if (strcmp(*argv,"-check") == 0)\n\t\t\tcheck=1;\n\t\telse if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"unknown option %s\\n",*argv);\n\t\t\tbadops=1;\n\t\t\tbreak;\n\t\t\t}\n\t\targc--;\n\t\targv++;\n\t\t}\n\tif (badops)\n\t\t{\nbad:\n\t\tBIO_printf(bio_err,"%s [options] <infile >outfile\\n",prog);\n\t\tBIO_printf(bio_err,"where options are\\n");\n\t\tBIO_printf(bio_err," -inform arg     input format - one of DER NET PEM\\n");\n\t\tBIO_printf(bio_err," -outform arg    output format - one of DER NET PEM\\n");\n\t\tBIO_printf(bio_err," -in arg         input file\\n");\n\t\tBIO_printf(bio_err," -sgckey         Use IIS SGC key format\\n");\n\t\tBIO_printf(bio_err," -passin arg     input file pass phrase source\\n");\n\t\tBIO_printf(bio_err," -out arg        output file\\n");\n\t\tBIO_printf(bio_err," -passout arg    output file pass phrase source\\n");\n\t\tBIO_printf(bio_err," -des            encrypt PEM output with cbc des\\n");\n\t\tBIO_printf(bio_err," -des3           encrypt PEM output with ede cbc des using 168 bit key\\n");\n#ifndef OPENSSL_NO_IDEA\n\t\tBIO_printf(bio_err," -idea           encrypt PEM output with cbc idea\\n");\n#endif\n#ifndef OPENSSL_NO_SEED\n\t\tBIO_printf(bio_err," -seed           encrypt PEM output with cbc seed\\n");\n#endif\n#ifndef OPENSSL_NO_AES\n\t\tBIO_printf(bio_err," -aes128, -aes192, -aes256\\n");\n\t\tBIO_printf(bio_err,"                 encrypt PEM output with cbc aes\\n");\n#endif\n#ifndef OPENSSL_NO_CAMELLIA\n\t\tBIO_printf(bio_err," -camellia128, -camellia192, -camellia256\\n");\n\t\tBIO_printf(bio_err,"                 encrypt PEM output with cbc camellia\\n");\n#endif\n\t\tBIO_printf(bio_err," -text           print the key in text\\n");\n\t\tBIO_printf(bio_err," -noout          don\'t print key out\\n");\n\t\tBIO_printf(bio_err," -modulus        print the RSA key modulus\\n");\n\t\tBIO_printf(bio_err," -check          verify key consistency\\n");\n\t\tBIO_printf(bio_err," -pubin          expect a public key in input file\\n");\n\t\tBIO_printf(bio_err," -pubout         output a public key\\n");\n#ifndef OPENSSL_NO_ENGINE\n\t\tBIO_printf(bio_err," -engine e       use engine e, possibly a hardware device.\\n");\n#endif\n\t\tgoto end;\n\t\t}\n\tERR_load_crypto_strings();\n#ifndef OPENSSL_NO_ENGINE\n        e = setup_engine(bio_err, engine, 0);\n#endif\n\tif(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {\n\t\tBIO_printf(bio_err, "Error getting passwords\\n");\n\t\tgoto end;\n\t}\n\tif(check && pubin) {\n\t\tBIO_printf(bio_err, "Only private keys can be checked\\n");\n\t\tgoto end;\n\t}\n\tout=BIO_new(BIO_s_file());\n\t{\n\t\tEVP_PKEY\t*pkey;\n\t\tif (pubin)\n\t\t\t{\n\t\t\tint tmpformat=-1;\n\t\t\tif (pubin == 2)\n\t\t\t\t{\n\t\t\t\tif (informat == FORMAT_PEM)\n\t\t\t\t\ttmpformat = FORMAT_PEMRSA;\n\t\t\t\telse if (informat == FORMAT_ASN1)\n\t\t\t\t\ttmpformat = FORMAT_ASN1RSA;\n\t\t\t\t}\n\t\t\telse if (informat == FORMAT_NETSCAPE && sgckey)\n\t\t\t\ttmpformat = FORMAT_IISSGC;\n\t\t\telse\n\t\t\t\ttmpformat = informat;\n\t\t\tpkey = load_pubkey(bio_err, infile, tmpformat, 1,\n\t\t\t\tpassin, e, "Public Key");\n\t\t\t}\n\t\telse\n\t\t\tpkey = load_key(bio_err, infile,\n\t\t\t\t(informat == FORMAT_NETSCAPE && sgckey ?\n\t\t\t\t\tFORMAT_IISSGC : informat), 1,\n\t\t\t\tpassin, e, "Private Key");\n\t\tif (pkey != NULL)\n\t\t\trsa = EVP_PKEY_get1_RSA(pkey);\n\t\tEVP_PKEY_free(pkey);\n\t}\n\tif (rsa == NULL)\n\t\t{\n\t\tERR_print_errors(bio_err);\n\t\tgoto end;\n\t\t}\n\tif (outfile == NULL)\n\t\t{\n\t\tBIO_set_fp(out,stdout,BIO_NOCLOSE);\n#ifdef OPENSSL_SYS_VMS\n\t\t{\n\t\tBIO *tmpbio = BIO_new(BIO_f_linebuffer());\n\t\tout = BIO_push(tmpbio, out);\n\t\t}\n#endif\n\t\t}\n\telse\n\t\t{\n\t\tif (BIO_write_filename(out,outfile) <= 0)\n\t\t\t{\n\t\t\tperror(outfile);\n\t\t\tgoto end;\n\t\t\t}\n\t\t}\n\tif (text)\n\t\tif (!RSA_print(out,rsa,0))\n\t\t\t{\n\t\t\tperror(outfile);\n\t\t\tERR_print_errors(bio_err);\n\t\t\tgoto end;\n\t\t\t}\n\tif (modulus)\n\t\t{\n\t\tBIO_printf(out,"Modulus=");\n\t\tBN_print(out,rsa->n);\n\t\tBIO_printf(out,"\\n");\n\t\t}\n\tif (check)\n\t\t{\n\t\tint r = RSA_check_key(rsa);\n\t\tif (r == 1)\n\t\t\tBIO_printf(out,"RSA key ok\\n");\n\t\telse if (r == 0)\n\t\t\t{\n\t\t\tunsigned long err;\n\t\t\twhile ((err = ERR_peek_error()) != 0 &&\n\t\t\t\tERR_GET_LIB(err) == ERR_LIB_RSA &&\n\t\t\t\tERR_GET_FUNC(err) == RSA_F_RSA_CHECK_KEY &&\n\t\t\t\tERR_GET_REASON(err) != ERR_R_MALLOC_FAILURE)\n\t\t\t\t{\n\t\t\t\tBIO_printf(out, "RSA key error: %s\\n", ERR_reason_error_string(err));\n\t\t\t\tERR_get_error();\n\t\t\t\t}\n\t\t\t}\n\t\tif (r == -1 || ERR_peek_error() != 0)\n\t\t\t{\n\t\t\tERR_print_errors(bio_err);\n\t\t\tgoto end;\n\t\t\t}\n\t\t}\n\tif (noout)\n\t\t{\n\t\tret = 0;\n\t\tgoto end;\n\t\t}\n\tBIO_printf(bio_err,"writing RSA key\\n");\n\tif \t(outformat == FORMAT_ASN1) {\n\t\tif(pubout || pubin)\n\t\t\t{\n\t\t\tif (pubout == 2)\n\t\t\t\ti=i2d_RSAPublicKey_bio(out,rsa);\n\t\t\telse\n\t\t\t\ti=i2d_RSA_PUBKEY_bio(out,rsa);\n\t\t\t}\n\t\telse i=i2d_RSAPrivateKey_bio(out,rsa);\n\t}\n#ifndef OPENSSL_NO_RC4\n\telse if (outformat == FORMAT_NETSCAPE)\n\t\t{\n\t\tunsigned char *p,*pp;\n\t\tint size;\n\t\ti=1;\n\t\tsize=i2d_RSA_NET(rsa,NULL,NULL, sgckey);\n\t\tif ((p=(unsigned char *)OPENSSL_malloc(size)) == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\tgoto end;\n\t\t\t}\n\t\tpp=p;\n\t\ti2d_RSA_NET(rsa,&p,NULL, sgckey);\n\t\tBIO_write(out,(char *)pp,size);\n\t\tOPENSSL_free(pp);\n\t\t}\n#endif\n\telse if (outformat == FORMAT_PEM) {\n\t\tif(pubout || pubin)\n\t\t\t{\n\t\t\tif (pubout == 2)\n\t\t    \t\ti=PEM_write_bio_RSAPublicKey(out,rsa);\n\t\t\telse\n\t\t    \t\ti=PEM_write_bio_RSA_PUBKEY(out,rsa);\n\t\t\t}\n\t\telse i=PEM_write_bio_RSAPrivateKey(out,rsa,\n\t\t\t\t\t\tenc,NULL,0,NULL,passout);\n\t} else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) {\n\t\tEVP_PKEY *pk;\n\t\tpk = EVP_PKEY_new();\n\t\tEVP_PKEY_set1_RSA(pk, rsa);\n\t\tif (outformat == FORMAT_PVK)\n\t\t\ti = i2b_PVK_bio(out, pk, pvk_encr, 0, passout);\n\t\telse if (pubin || pubout)\n\t\t\ti = i2b_PublicKey_bio(out, pk);\n\t\telse\n\t\t\ti = i2b_PrivateKey_bio(out, pk);\n\t\tEVP_PKEY_free(pk);\n\t} else\t{\n\t\tBIO_printf(bio_err,"bad output format specified for outfile\\n");\n\t\tgoto end;\n\t\t}\n\tif (!i)\n\t\t{\n\t\tBIO_printf(bio_err,"unable to write key\\n");\n\t\tERR_print_errors(bio_err);\n\t\t}\n\telse\n\t\tret=0;\nend:\n\tif(out != NULL) BIO_free_all(out);\n\tif(rsa != NULL) RSA_free(rsa);\n\tif(passin) OPENSSL_free(passin);\n\tif(passout) OPENSSL_free(passout);\n\tapps_shutdown();\n\tOPENSSL_EXIT(ret);\n\t}', 'int BN_print(BIO *bp, const BIGNUM *a)\n\t{\n\tint i,j,v,z=0;\n\tint ret=0;\n\tif ((a->neg) && (BIO_write(bp,"-",1) != 1)) goto end;\n\tif (BN_is_zero(a) && (BIO_write(bp,"0",1) != 1)) goto end;\n\tfor (i=a->top-1; i >=0; i--)\n\t\t{\n\t\tfor (j=BN_BITS2-4; j >= 0; j-=4)\n\t\t\t{\n\t\t\tv=((int)(a->d[i]>>(long)j))&0x0f;\n\t\t\tif (z || (v != 0))\n\t\t\t\t{\n\t\t\t\tif (BIO_write(bp,&(Hex[v]),1) != 1)\n\t\t\t\t\tgoto end;\n\t\t\t\tz=1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tret=1;\nend:\n\treturn(ret);\n\t}', 'int RSA_check_key(const RSA *key)\n\t{\n\tBIGNUM *i, *j, *k, *l, *m;\n\tBN_CTX *ctx;\n\tint r;\n\tint ret=1;\n\ti = BN_new();\n\tj = BN_new();\n\tk = BN_new();\n\tl = BN_new();\n\tm = BN_new();\n\tctx = BN_CTX_new();\n\tif (i == NULL || j == NULL || k == NULL || l == NULL ||\n\t\tm == NULL || ctx == NULL)\n\t\t{\n\t\tret = -1;\n\t\tRSAerr(RSA_F_RSA_CHECK_KEY, ERR_R_MALLOC_FAILURE);\n\t\tgoto err;\n\t\t}\n\tr = BN_is_prime_ex(key->p, BN_prime_checks, NULL, NULL);\n\tif (r != 1)\n\t\t{\n\t\tret = r;\n\t\tif (r != 0)\n\t\t\tgoto err;\n\t\tRSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_P_NOT_PRIME);\n\t\t}\n\tr = BN_is_prime_ex(key->q, BN_prime_checks, NULL, NULL);\n\tif (r != 1)\n\t\t{\n\t\tret = r;\n\t\tif (r != 0)\n\t\t\tgoto err;\n\t\tRSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_Q_NOT_PRIME);\n\t\t}\n\tr = BN_mul(i, key->p, key->q, ctx);\n\tif (!r) { ret = -1; goto err; }\n\tif (BN_cmp(i, key->n) != 0)\n\t\t{\n\t\tret = 0;\n\t\tRSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_N_DOES_NOT_EQUAL_P_Q);\n\t\t}\n\tr = BN_sub(i, key->p, BN_value_one());\n\tif (!r) { ret = -1; goto err; }\n\tr = BN_sub(j, key->q, BN_value_one());\n\tif (!r) { ret = -1; goto err; }\n\tr = BN_mul(l, i, j, ctx);\n\tif (!r) { ret = -1; goto err; }\n\tr = BN_gcd(m, i, j, ctx);\n\tif (!r) { ret = -1; goto err; }\n\tr = BN_div(k, NULL, l, m, ctx);\n\tif (!r) { ret = -1; goto err; }\n\tr = BN_mod_mul(i, key->d, key->e, k, ctx);\n\tif (!r) { ret = -1; goto err; }\n\tif (!BN_is_one(i))\n\t\t{\n\t\tret = 0;\n\t\tRSAerr(RSA_F_RSA_CHECK_KEY, RSA_R_D_E_NOT_CONGRUENT_TO_1);\n\t\t}\n\tif (key->dmp1 != NULL && key->dmq1 != NULL && key->iqmp != NULL)\n\t\t{\n\t\tr = BN_sub(i, key->p, BN_value_one());\n\t\tif (!r) { ret = -1; goto err; }\n\t\tr = BN_mod(j, key->d, i, ctx);\n\t\tif (!r) { ret = -1; goto err; }\n\t\tif (BN_cmp(j, key->dmp1) != 0)\n\t\t\t{\n\t\t\tret = 0;\n\t\t\tRSAerr(RSA_F_RSA_CHECK_KEY,\n\t\t\t\tRSA_R_DMP1_NOT_CONGRUENT_TO_D);\n\t\t\t}\n\t\tr = BN_sub(i, key->q, BN_value_one());\n\t\tif (!r) { ret = -1; goto err; }\n\t\tr = BN_mod(j, key->d, i, ctx);\n\t\tif (!r) { ret = -1; goto err; }\n\t\tif (BN_cmp(j, key->dmq1) != 0)\n\t\t\t{\n\t\t\tret = 0;\n\t\t\tRSAerr(RSA_F_RSA_CHECK_KEY,\n\t\t\t\tRSA_R_DMQ1_NOT_CONGRUENT_TO_D);\n\t\t\t}\n\t\tif(!BN_mod_inverse(i, key->q, key->p, ctx))\n\t\t\t{\n\t\t\tret = -1;\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (BN_cmp(i, key->iqmp) != 0)\n\t\t\t{\n\t\t\tret = 0;\n\t\t\tRSAerr(RSA_F_RSA_CHECK_KEY,\n\t\t\t\tRSA_R_IQMP_NOT_INVERSE_OF_Q);\n\t\t\t}\n\t\t}\n err:\n\tif (i != NULL) BN_free(i);\n\tif (j != NULL) BN_free(j);\n\tif (k != NULL) BN_free(k);\n\tif (l != NULL) BN_free(l);\n\tif (m != NULL) BN_free(m);\n\tif (ctx != NULL) BN_CTX_free(ctx);\n\treturn (ret);\n\t}', 'int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,\n\t   BN_CTX *ctx)\n\t{\n\tint norm_shift,i;\n\tsize_t loop;\n\tBIGNUM *tmp,wnum,*snum,*sdiv,*res;\n\tBN_ULONG *resp,*wnump;\n\tBN_ULONG d0,d1;\n\tsize_t num_n,div_n;\n\tif (num->top > 0 && num->d[num->top - 1] == 0)\n\t\t{\n\t\tBNerr(BN_F_BN_DIV,BN_R_NOT_INITIALIZED);\n\t\treturn 0;\n\t\t}\n\tbn_check_top(num);\n\tif ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0))\n\t\t{\n\t\treturn BN_div_no_branch(dv, rm, num, divisor, ctx);\n\t\t}\n\tbn_check_top(dv);\n\tbn_check_top(rm);\n\tbn_check_top(divisor);\n\tif (BN_is_zero(divisor))\n\t\t{\n\t\tBNerr(BN_F_BN_DIV,BN_R_DIV_BY_ZERO);\n\t\treturn(0);\n\t\t}\n\tif (BN_ucmp(num,divisor) < 0)\n\t\t{\n\t\tif (rm != NULL)\n\t\t\t{ if (BN_copy(rm,num) == NULL) return(0); }\n\t\tif (dv != NULL) BN_zero(dv);\n\t\treturn(1);\n\t\t}\n\tBN_CTX_start(ctx);\n\ttmp=BN_CTX_get(ctx);\n\tsnum=BN_CTX_get(ctx);\n\tsdiv=BN_CTX_get(ctx);\n\tif (dv == NULL)\n\t\tres=BN_CTX_get(ctx);\n\telse\tres=dv;\n\tif (sdiv == NULL || res == NULL) goto err;\n\tnorm_shift=BN_BITS2-((BN_num_bits(divisor))%BN_BITS2);\n\tif (!(BN_lshift(sdiv,divisor,norm_shift))) goto err;\n\tsdiv->neg=0;\n\tnorm_shift+=BN_BITS2;\n\tif (!(BN_lshift(snum,num,norm_shift))) goto err;\n\tsnum->neg=0;\n\tdiv_n=sdiv->top;\n\tnum_n=snum->top;\n\tloop=num_n-div_n;\n\twnum.neg   = 0;\n\twnum.d     = &(snum->d[loop]);\n\twnum.top   = div_n;\n\twnum.dmax  = snum->dmax - loop;\n\td0=sdiv->d[div_n-1];\n\td1=(div_n == 1)?0:sdiv->d[div_n-2];\n\twnump= &(snum->d[num_n-1]);\n\tres->neg= (num->neg^divisor->neg);\n\tif (!bn_wexpand(res,(loop+1))) goto err;\n\tres->top=loop;\n\tresp= &(res->d[loop-1]);\n\tif (!bn_wexpand(tmp, div_n+1)) goto err;\n\tif (BN_ucmp(&wnum,sdiv) >= 0)\n\t\t{\n\t\tbn_clear_top2max(&wnum);\n\t\tbn_sub_words(wnum.d, wnum.d, sdiv->d, div_n);\n\t\t*resp=1;\n\t\t}\n\telse\n\t\tres->top--;\n\tif (res->top == 0)\n\t\tres->neg = 0;\n\telse\n\t\tresp--;\n\tfor (i=0; i<loop-1; i++, wnump--, resp--)\n\t\t{\n\t\tBN_ULONG q,l0;\n#if defined(BN_DIV3W) && !defined(OPENSSL_NO_ASM)\n\t\tBN_ULONG bn_div_3_words(BN_ULONG*,BN_ULONG,BN_ULONG);\n\t\tq=bn_div_3_words(wnump,d1,d0);\n#else\n\t\tBN_ULONG n0,n1,rem=0;\n\t\tn0=wnump[0];\n\t\tn1=wnump[-1];\n\t\tif (n0 == d0)\n\t\t\tq=BN_MASK2;\n\t\telse\n\t\t\t{\n#ifdef BN_LLONG\n\t\t\tBN_ULLONG t2;\n#if defined(BN_LLONG) && defined(BN_DIV2W) && !defined(bn_div_words)\n\t\t\tq=(BN_ULONG)(((((BN_ULLONG)n0)<<BN_BITS2)|n1)/d0);\n#else\n\t\t\tq=bn_div_words(n0,n1,d0);\n#ifdef BN_DEBUG_LEVITTE\n\t\t\tfprintf(stderr,"DEBUG: bn_div_words(0x%08X,0x%08X,0x%08\\\nX) -> 0x%08X\\n",\n\t\t\t\tn0, n1, d0, q);\n#endif\n#endif\n#ifndef REMAINDER_IS_ALREADY_CALCULATED\n\t\t\trem=(n1-q*d0)&BN_MASK2;\n#endif\n\t\t\tt2=(BN_ULLONG)d1*q;\n\t\t\tfor (;;)\n\t\t\t\t{\n\t\t\t\tif (t2 <= ((((BN_ULLONG)rem)<<BN_BITS2)|wnump[-2]))\n\t\t\t\t\tbreak;\n\t\t\t\tq--;\n\t\t\t\trem += d0;\n\t\t\t\tif (rem < d0) break;\n\t\t\t\tt2 -= d1;\n\t\t\t\t}\n#else\n\t\t\tBN_ULONG t2l,t2h;\n\t\t\tq=bn_div_words(n0,n1,d0);\n#ifdef BN_DEBUG_LEVITTE\n\t\t\tfprintf(stderr,"DEBUG: bn_div_words(0x%08X,0x%08X,0x%08\\\nX) -> 0x%08X\\n",\n\t\t\t\tn0, n1, d0, q);\n#endif\n#ifndef REMAINDER_IS_ALREADY_CALCULATED\n\t\t\trem=(n1-q*d0)&BN_MASK2;\n#endif\n#if defined(BN_UMULT_LOHI)\n\t\t\tBN_UMULT_LOHI(t2l,t2h,d1,q);\n#elif defined(BN_UMULT_HIGH)\n\t\t\tt2l = d1 * q;\n\t\t\tt2h = BN_UMULT_HIGH(d1,q);\n#else\n\t\t\t{\n\t\t\tBN_ULONG ql, qh;\n\t\t\tt2l=LBITS(d1); t2h=HBITS(d1);\n\t\t\tql =LBITS(q);  qh =HBITS(q);\n\t\t\tmul64(t2l,t2h,ql,qh);\n\t\t\t}\n#endif\n\t\t\tfor (;;)\n\t\t\t\t{\n\t\t\t\tif ((t2h < rem) ||\n\t\t\t\t\t((t2h == rem) && (t2l <= wnump[-2])))\n\t\t\t\t\tbreak;\n\t\t\t\tq--;\n\t\t\t\trem += d0;\n\t\t\t\tif (rem < d0) break;\n\t\t\t\tif (t2l < d1) t2h--; t2l -= d1;\n\t\t\t\t}\n#endif\n\t\t\t}\n#endif\n\t\tl0=bn_mul_words(tmp->d,sdiv->d,div_n,q);\n\t\ttmp->d[div_n]=l0;\n\t\twnum.d--;\n\t\tif (bn_sub_words(wnum.d, wnum.d, tmp->d, div_n+1))\n\t\t\t{\n\t\t\tq--;\n\t\t\tif (bn_add_words(wnum.d, wnum.d, sdiv->d, div_n))\n\t\t\t\t(*wnump)++;\n\t\t\t}\n\t\t*resp = q;\n\t\t}\n\tbn_correct_top(snum);\n\tif (rm != NULL)\n\t\t{\n\t\tint neg = num->neg;\n\t\tBN_rshift(rm,snum,norm_shift);\n\t\tif (!BN_is_zero(rm))\n\t\t\trm->neg = neg;\n\t\tbn_check_top(rm);\n\t\t}\n\tBN_CTX_end(ctx);\n\treturn(1);\nerr:\n\tbn_check_top(rm);\n\tBN_CTX_end(ctx);\n\treturn(0);\n\t}', 'static int BN_div_no_branch(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num,\n\tconst BIGNUM *divisor, BN_CTX *ctx)\n\t{\n\tint norm_shift,i,loop;\n\tBIGNUM *tmp,wnum,*snum,*sdiv,*res;\n\tBN_ULONG *resp,*wnump;\n\tBN_ULONG d0,d1;\n\tsize_t num_n,div_n;\n\tbn_check_top(dv);\n\tbn_check_top(rm);\n\tbn_check_top(divisor);\n\tif (BN_is_zero(divisor))\n\t\t{\n\t\tBNerr(BN_F_BN_DIV_NO_BRANCH,BN_R_DIV_BY_ZERO);\n\t\treturn(0);\n\t\t}\n\tBN_CTX_start(ctx);\n\ttmp=BN_CTX_get(ctx);\n\tsnum=BN_CTX_get(ctx);\n\tsdiv=BN_CTX_get(ctx);\n\tif (dv == NULL)\n\t\tres=BN_CTX_get(ctx);\n\telse\tres=dv;\n\tif (sdiv == NULL || res == NULL) goto err;\n\tnorm_shift=BN_BITS2-((BN_num_bits(divisor))%BN_BITS2);\n\tif (!(BN_lshift(sdiv,divisor,norm_shift))) goto err;\n\tsdiv->neg=0;\n\tnorm_shift+=BN_BITS2;\n\tif (!(BN_lshift(snum,num,norm_shift))) goto err;\n\tsnum->neg=0;\n\tif (snum->top <= sdiv->top+1)\n\t\t{\n\t\tif (bn_wexpand(snum, sdiv->top + 2) == NULL) goto err;\n\t\tfor (i = snum->top; i < sdiv->top + 2; i++) snum->d[i] = 0;\n\t\tsnum->top = sdiv->top + 2;\n\t\t}\n\telse\n\t\t{\n\t\tif (bn_wexpand(snum, snum->top + 1) == NULL) goto err;\n\t\tsnum->d[snum->top] = 0;\n\t\tsnum->top ++;\n\t\t}\n\tdiv_n=sdiv->top;\n\tnum_n=snum->top;\n\tloop=num_n-div_n;\n\twnum.neg   = 0;\n\twnum.d     = &(snum->d[loop]);\n\twnum.top   = div_n;\n\twnum.dmax  = snum->dmax - loop;\n\td0=sdiv->d[div_n-1];\n\td1=(div_n == 1)?0:sdiv->d[div_n-2];\n\twnump= &(snum->d[num_n-1]);\n\tres->neg= (num->neg^divisor->neg);\n\tif (!bn_wexpand(res,loop+1U)) goto err;\n\tres->top=loop-1;\n\tresp= &(res->d[loop-1]);\n\tif (!bn_wexpand(tmp,div_n+1U)) goto err;\n\tif (res->top == 0)\n\t\tres->neg = 0;\n\telse\n\t\tresp--;\n\tfor (i=0; i<loop-1; i++, wnump--, resp--)\n\t\t{\n\t\tBN_ULONG q,l0;\n#if defined(BN_DIV3W) && !defined(OPENSSL_NO_ASM)\n\t\tBN_ULONG bn_div_3_words(BN_ULONG*,BN_ULONG,BN_ULONG);\n\t\tq=bn_div_3_words(wnump,d1,d0);\n#else\n\t\tBN_ULONG n0,n1,rem=0;\n\t\tn0=wnump[0];\n\t\tn1=wnump[-1];\n\t\tif (n0 == d0)\n\t\t\tq=BN_MASK2;\n\t\telse\n\t\t\t{\n#ifdef BN_LLONG\n\t\t\tBN_ULLONG t2;\n#if defined(BN_LLONG) && defined(BN_DIV2W) && !defined(bn_div_words)\n\t\t\tq=(BN_ULONG)(((((BN_ULLONG)n0)<<BN_BITS2)|n1)/d0);\n#else\n\t\t\tq=bn_div_words(n0,n1,d0);\n#ifdef BN_DEBUG_LEVITTE\n\t\t\tfprintf(stderr,"DEBUG: bn_div_words(0x%08X,0x%08X,0x%08\\\nX) -> 0x%08X\\n",\n\t\t\t\tn0, n1, d0, q);\n#endif\n#endif\n#ifndef REMAINDER_IS_ALREADY_CALCULATED\n\t\t\trem=(n1-q*d0)&BN_MASK2;\n#endif\n\t\t\tt2=(BN_ULLONG)d1*q;\n\t\t\tfor (;;)\n\t\t\t\t{\n\t\t\t\tif (t2 <= ((((BN_ULLONG)rem)<<BN_BITS2)|wnump[-2]))\n\t\t\t\t\tbreak;\n\t\t\t\tq--;\n\t\t\t\trem += d0;\n\t\t\t\tif (rem < d0) break;\n\t\t\t\tt2 -= d1;\n\t\t\t\t}\n#else\n\t\t\tBN_ULONG t2l,t2h;\n\t\t\tq=bn_div_words(n0,n1,d0);\n#ifdef BN_DEBUG_LEVITTE\n\t\t\tfprintf(stderr,"DEBUG: bn_div_words(0x%08X,0x%08X,0x%08\\\nX) -> 0x%08X\\n",\n\t\t\t\tn0, n1, d0, q);\n#endif\n#ifndef REMAINDER_IS_ALREADY_CALCULATED\n\t\t\trem=(n1-q*d0)&BN_MASK2;\n#endif\n#if defined(BN_UMULT_LOHI)\n\t\t\tBN_UMULT_LOHI(t2l,t2h,d1,q);\n#elif defined(BN_UMULT_HIGH)\n\t\t\tt2l = d1 * q;\n\t\t\tt2h = BN_UMULT_HIGH(d1,q);\n#else\n\t\t\t{\n\t\t\tBN_ULONG ql, qh;\n\t\t\tt2l=LBITS(d1); t2h=HBITS(d1);\n\t\t\tql =LBITS(q);  qh =HBITS(q);\n\t\t\tmul64(t2l,t2h,ql,qh);\n\t\t\t}\n#endif\n\t\t\tfor (;;)\n\t\t\t\t{\n\t\t\t\tif ((t2h < rem) ||\n\t\t\t\t\t((t2h == rem) && (t2l <= wnump[-2])))\n\t\t\t\t\tbreak;\n\t\t\t\tq--;\n\t\t\t\trem += d0;\n\t\t\t\tif (rem < d0) break;\n\t\t\t\tif (t2l < d1) t2h--; t2l -= d1;\n\t\t\t\t}\n#endif\n\t\t\t}\n#endif\n\t\tl0=bn_mul_words(tmp->d,sdiv->d,div_n,q);\n\t\ttmp->d[div_n]=l0;\n\t\twnum.d--;\n\t\tif (bn_sub_words(wnum.d, wnum.d, tmp->d, div_n+1))\n\t\t\t{\n\t\t\tq--;\n\t\t\tif (bn_add_words(wnum.d, wnum.d, sdiv->d, div_n))\n\t\t\t\t(*wnump)++;\n\t\t\t}\n\t\t*resp = q;\n\t\t}\n\tbn_correct_top(snum);\n\tif (rm != NULL)\n\t\t{\n\t\tint neg = num->neg;\n\t\tBN_rshift(rm,snum,norm_shift);\n\t\tif (!BN_is_zero(rm))\n\t\t\trm->neg = neg;\n\t\tbn_check_top(rm);\n\t\t}\n\tbn_correct_top(res);\n\tBN_CTX_end(ctx);\n\treturn(1);\nerr:\n\tbn_check_top(rm);\n\tBN_CTX_end(ctx);\n\treturn(0);\n\t}', 'int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)\n\t{\n\tint i,nw,lb,rb;\n\tBN_ULONG *t,*f;\n\tBN_ULONG l;\n\tbn_check_top(r);\n\tbn_check_top(a);\n\tr->neg=a->neg;\n\tnw=n/BN_BITS2;\n\tif (bn_wexpand(r,a->top+nw+1) == NULL) return(0);\n\tlb=n%BN_BITS2;\n\trb=BN_BITS2-lb;\n\tf=a->d;\n\tt=r->d;\n\tt[a->top+nw]=0;\n\tif (lb == 0)\n\t\tfor (i=a->top-1; i>=0; i--)\n\t\t\tt[nw+i]=f[i];\n\telse\n\t\tfor (i=a->top-1; i>=0; i--)\n\t\t\t{\n\t\t\tl=f[i];\n\t\t\tt[nw+i+1]|=(l>>rb)&BN_MASK2;\n\t\t\tt[nw+i]=(l<<lb)&BN_MASK2;\n\t\t\t}\n\tmemset(t,0,nw*sizeof(t[0]));\n\tr->top=a->top+nw+1;\n\tbn_correct_top(r);\n\tbn_check_top(r);\n\treturn(1);\n\t}']