4 int sv_to_BIGNUM(var,arg,name)
11 if (sv_derived_from(arg,"OpenSSL::BN"))
13 IV tmp = SvIV((SV*)SvRV(arg));
14 *var = (BIGNUM *) tmp;
16 else if (SvIOK(arg)) {
17 SV *tmp=sv_newmortal();
19 BN_set_word(*var,SvIV(arg));
20 sv_setref_pv(tmp,"OpenSSL::BN",(void*)*var);
22 else if (SvPOK(arg)) {
25 SV *tmp=sv_newmortal();
27 sv_setref_pv(tmp,"OpenSSL::BN", (void*)*var);
41 typedef struct gpc_args_st {
46 static void generate_prime_callback(pos,num,arg)
53 GPC_ARGS *a=(GPC_ARGS *)arg;
59 XPUSHs(sv_2mortal(newSViv(pos)));
60 XPUSHs(sv_2mortal(newSViv(num)));
61 XPUSHs(sv_2mortal(newSVsv(a->arg)));
64 i=perl_call_sv(a->cb,G_DISCARD);
73 MODULE = OpenSSL::BN PACKAGE = OpenSSL::BN PREFIX = p5_BN_
85 PUSHs(sv_newmortal());
87 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)bn);
97 PUSHs(sv_newmortal());
99 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)bn);
109 pr_name("p5_BN_rand");
110 if ((items < 1) || (items > 3))
111 croak("Usage: OpenSSL::BN::rand(bits[,top_bit][,bottombit]");
112 if (items >= 2) top=(int)SvIV(ST(0));
113 if (items >= 3) bottom=(int)SvIV(ST(1));
115 PUSHs(sv_newmortal());
117 BN_rand(ret,bits,top,bottom);
118 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
126 pr_name("p5_BN_bin2bn");
128 PUSHs(sv_newmortal());
129 ret=BN_bin2bn(a.dptr,a.dsize,NULL);
130 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
138 pr_name("p5_BN_bn2bin");
140 PUSHs(sv_newmortal());
142 sv_setpvn(ST(0),"",1);
144 SvCUR_set(ST(0),BN_bn2bin(a,SvPV(ST(0),na)));
152 pr_name("p5_BN_mpi2bn");
154 PUSHs(sv_newmortal());
155 ret=BN_mpi2bn(a.dptr,a.dsize,NULL);
156 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
164 pr_name("p5_BN_bn2mpi");
166 PUSHs(sv_newmortal());
168 sv_setpvn(ST(0),"",1);
170 SvCUR_set(ST(0),BN_bn2mpi(a,SvPV(ST(0),na)));
178 pr_name("p5_BN_hex2bn");
180 PUSHs(sv_newmortal());
182 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
183 BN_hex2bn(&ret,a.dptr);
191 pr_name("p5_BN_dec2bn");
193 PUSHs(sv_newmortal());
195 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
196 BN_dec2bn(&ret,a.dptr);
205 pr_name("p5_BN_bn2hex");
207 RETVAL=newSVpv("",0);
210 memcpy(SvPV(RETVAL,na),ptr,i+1);
223 pr_name("p5_BN_bn2dec");
225 RETVAL=newSVpv("",0);
228 memcpy(SvPV(RETVAL,na),ptr,i+1);
241 pr_name("p5_BN_add");
243 PUSHs(sv_newmortal());
245 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
255 pr_name("p5_BN_sub");
257 PUSHs(sv_newmortal());
259 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
267 static BN_CTX *ctx=NULL;
270 pr_name("p5_BN_mul");
271 if (ctx == NULL) ctx=BN_CTX_new();
273 PUSHs(sv_newmortal());
275 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
283 static BN_CTX *ctx=NULL;
286 pr_name("p5_BN_div");
287 if (ctx == NULL) ctx=BN_CTX_new();
289 PUSHs(sv_newmortal());
290 PUSHs(sv_newmortal());
293 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)div);
294 sv_setref_pv(ST(1), "OpenSSL::BN", (void*)mod);
295 BN_div(div,mod,a,b,ctx);
302 static BN_CTX *ctx=NULL;
305 pr_name("p5_BN_mod");
306 if (ctx == NULL) ctx=BN_CTX_new();
308 PUSHs(sv_newmortal());
310 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)rem);
319 static BN_CTX *ctx=NULL;
321 pr_name("p5_BN_exp");
322 if (ctx == NULL) ctx=BN_CTX_new();
324 PUSHs(sv_newmortal());
326 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
335 static BN_CTX *ctx=NULL;
338 pr_name("p5_BN_mod_mul");
339 if (ctx == NULL) ctx=BN_CTX_new();
341 PUSHs(sv_newmortal());
343 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
344 BN_mod_mul(ret,a,b,c,ctx);
352 static BN_CTX *ctx=NULL;
355 pr_name("p5_BN_mod_exp");
356 if (ctx == NULL) ctx=BN_CTX_new();
358 PUSHs(sv_newmortal());
360 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
361 BN_mod_exp(ret,a,b,c,ctx);
364 p5_BN_generate_prime(...)
375 pr_name("p5_BN_generate_prime");
376 if ((items < 0) || (items > 4))
377 croak("Usage: OpenSSL::BN::generate_prime(a[,strong][,callback][,cb_arg]");
378 if (items >= 1) bits=(int)SvIV(ST(0));
379 if (items >= 2) strong=(int)SvIV(ST(1));
380 if (items >= 3) callback=ST(2);
381 if (items == 4) cb_arg=ST(3);
383 if (callback == NULL)
384 ret=BN_generate_prime(ret,bits,strong,NULL,NULL,NULL,NULL);
390 ret=BN_generate_prime(ret,bits,strong,NULL,NULL,
391 generate_prime_callback,(char *)&arg);
395 sp-=items; /* a bit evil that I do this */
398 PUSHs(sv_newmortal());
399 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
402 p5_BN_is_prime(p,...)
410 static BN_CTX *ctx=NULL;
412 pr_name("p5_BN_is_prime");
413 if ((items < 1) || (items > 4))
414 croak("Usage: OpenSSL::BN::is_prime(a[,ncheck][,callback][,callback_arg]");
415 if (ctx == NULL) ctx=BN_CTX_new();
416 if (items >= 2) nchecks=(int)SvIV(ST(1));
417 if (items >= 3) callback=ST(2);
418 if (items >= 4) cb_arg=ST(3);
420 if (callback == NULL)
421 ret=BN_is_prime(p,nchecks,NULL,ctx,NULL);
426 ret=BN_is_prime(p,nchecks,generate_prime_callback,
430 sp-=items; /* a bit evil */
431 PUSHs(sv_2mortal(newSViv(ret)));
437 pr_name("p5_BN_num_bits");
438 RETVAL=BN_num_bits(a);
447 pr_name("p5_BN_cmp");
457 pr_name("p5_BN_ucmp");
463 p5_BN_is_bit_set(a,b)
467 pr_name("p5_BN_is_bit_set");
468 RETVAL=BN_is_bit_set(a,b);
479 pr_name("p5_BN_set_bit");
481 PUSHs(sv_newmortal());
483 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
493 pr_name("p5_BN_clear_bit");
495 PUSHs(sv_newmortal());
497 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
507 pr_name("p5_BN_lshift");
509 PUSHs(sv_newmortal());
511 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
524 pr_name("p5_BN_rshift");
526 PUSHs(sv_newmortal());
528 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
541 pr_name("p5_BN_mask_bits");
543 PUSHs(sv_newmortal());
545 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
552 pr_name("p5_BN_clear");
560 static BN_CTX *ctx=NULL;
563 pr_name("p5_BN_gcd");
564 if (ctx == NULL) ctx=BN_CTX_new();
566 PUSHs(sv_newmortal());
568 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
572 p5_BN_mod_inverse(a,mod)
576 static BN_CTX *ctx=NULL;
579 pr_name("p5_BN_mod_inverse");
580 if (ctx == NULL) ctx=BN_CTX_new();
581 ret=BN_mod_inverse(ret,a,mod,ctx);
583 PUSHs(sv_newmortal());
584 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
590 pr_name("p5_BN_DESTROY");