3 int sv_to_BIGNUM(var,arg,name)
10 if (sv_derived_from(arg,"SSLeay::BN"))
12 IV tmp = SvIV((SV*)SvRV(arg));
13 *var = (BIGNUM *) tmp;
15 else if (SvIOK(arg)) {
16 SV *tmp=sv_newmortal();
18 BN_set_word(*var,SvIV(arg));
19 sv_setref_pv(tmp,"SSLeay::BN",(void*)*var);
21 else if (SvPOK(arg)) {
24 SV *tmp=sv_newmortal();
26 sv_setref_pv(tmp,"SSLeay::BN", (void*)*var);
40 typedef struct gpc_args_st {
45 static void generate_prime_callback(pos,num,arg)
52 GPC_ARGS *a=(GPC_ARGS *)arg;
58 XPUSHs(sv_2mortal(newSViv(pos)));
59 XPUSHs(sv_2mortal(newSViv(num)));
60 XPUSHs(sv_2mortal(newSVsv(a->arg)));
63 i=perl_call_sv(a->cb,G_DISCARD);
72 MODULE = SSLeay::BN PACKAGE = SSLeay::BN PREFIX = p5_BN_
84 PUSHs(sv_newmortal());
86 sv_setref_pv(ST(0), "SSLeay::BN", (void*)bn);
96 PUSHs(sv_newmortal());
98 sv_setref_pv(ST(0), "SSLeay::BN", (void*)bn);
108 pr_name("p5_BN_rand");
109 if ((items < 1) || (items > 3))
110 croak("Usage: SSLeay::BN::rand(bits[,top_bit][,bottombit]");
111 if (items >= 2) top=(int)SvIV(ST(0));
112 if (items >= 3) bottom=(int)SvIV(ST(1));
114 PUSHs(sv_newmortal());
116 BN_rand(ret,bits,top,bottom);
117 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
125 pr_name("p5_BN_bin2bn");
127 PUSHs(sv_newmortal());
128 ret=BN_bin2bn(a.dptr,a.dsize,NULL);
129 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
137 pr_name("p5_BN_bn2bin");
139 PUSHs(sv_newmortal());
141 sv_setpvn(ST(0),"",1);
143 SvCUR_set(ST(0),BN_bn2bin(a,SvPV(ST(0),na)));
151 pr_name("p5_BN_mpi2bn");
153 PUSHs(sv_newmortal());
154 ret=BN_mpi2bn(a.dptr,a.dsize,NULL);
155 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
163 pr_name("p5_BN_bn2mpi");
165 PUSHs(sv_newmortal());
167 sv_setpvn(ST(0),"",1);
169 SvCUR_set(ST(0),BN_bn2mpi(a,SvPV(ST(0),na)));
177 pr_name("p5_BN_hex2bn");
179 PUSHs(sv_newmortal());
181 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
182 BN_hex2bn(&ret,a.dptr);
190 pr_name("p5_BN_dec2bn");
192 PUSHs(sv_newmortal());
194 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
195 BN_dec2bn(&ret,a.dptr);
204 pr_name("p5_BN_bn2hex");
206 RETVAL=newSVpv("",0);
209 memcpy(SvPV(RETVAL,na),ptr,i+1);
222 pr_name("p5_BN_bn2dec");
224 RETVAL=newSVpv("",0);
227 memcpy(SvPV(RETVAL,na),ptr,i+1);
240 pr_name("p5_BN_add");
242 PUSHs(sv_newmortal());
244 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
254 pr_name("p5_BN_sub");
256 PUSHs(sv_newmortal());
258 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
268 pr_name("p5_BN_mul");
270 PUSHs(sv_newmortal());
272 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
280 static BN_CTX *ctx=NULL;
283 pr_name("p5_BN_div");
284 if (ctx == NULL) ctx=BN_CTX_new();
286 PUSHs(sv_newmortal());
287 PUSHs(sv_newmortal());
290 sv_setref_pv(ST(0), "SSLeay::BN", (void*)div);
291 sv_setref_pv(ST(1), "SSLeay::BN", (void*)mod);
292 BN_div(div,mod,a,b,ctx);
299 static BN_CTX *ctx=NULL;
302 pr_name("p5_BN_mod");
303 if (ctx == NULL) ctx=BN_CTX_new();
305 PUSHs(sv_newmortal());
307 sv_setref_pv(ST(0), "SSLeay::BN", (void*)rem);
316 static BN_CTX *ctx=NULL;
318 pr_name("p5_BN_exp");
319 if (ctx == NULL) ctx=BN_CTX_new();
321 PUSHs(sv_newmortal());
323 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
332 static BN_CTX *ctx=NULL;
335 pr_name("p5_BN_mod_mul");
336 if (ctx == NULL) ctx=BN_CTX_new();
338 PUSHs(sv_newmortal());
340 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
341 BN_mod_mul(ret,a,b,c,ctx);
349 static BN_CTX *ctx=NULL;
352 pr_name("p5_BN_mod_exp");
353 if (ctx == NULL) ctx=BN_CTX_new();
355 PUSHs(sv_newmortal());
357 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
358 BN_mod_exp(ret,a,b,c,ctx);
361 p5_BN_generate_prime(...)
372 pr_name("p5_BN_generate_prime");
373 if ((items < 0) || (items > 4))
374 croak("Usage: SSLeay::BN::generate_prime(a[,strong][,callback][,cb_arg]");
375 if (items >= 1) bits=(int)SvIV(ST(0));
376 if (items >= 2) strong=(int)SvIV(ST(1));
377 if (items >= 3) callback=ST(2);
378 if (items == 4) cb_arg=ST(3);
380 if (callback == NULL)
381 ret=BN_generate_prime(bits,strong,NULL,NULL,NULL,NULL);
387 ret=BN_generate_prime(bits,strong,NULL,NULL,
388 generate_prime_callback,(char *)&arg);
392 sp-=items; /* a bit evil that I do this */
395 PUSHs(sv_newmortal());
396 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
399 p5_BN_is_prime(p,...)
407 static BN_CTX *ctx=NULL;
409 pr_name("p5_BN_is_prime");
410 if ((items < 1) || (items > 4))
411 croak("Usage: SSLeay::BN::is_prime(a[,ncheck][,callback][,callback_arg]");
412 if (ctx == NULL) ctx=BN_CTX_new();
413 if (items >= 2) nchecks=(int)SvIV(ST(1));
414 if (items >= 3) callback=ST(2);
415 if (items >= 4) cb_arg=ST(3);
417 if (callback == NULL)
418 ret=BN_is_prime(p,nchecks,NULL,ctx,NULL);
423 ret=BN_is_prime(p,nchecks,generate_prime_callback,
427 sp-=items; /* a bit evil */
428 PUSHs(sv_2mortal(newSViv(ret)));
434 pr_name("p5_BN_num_bits");
435 RETVAL=BN_num_bits(a);
444 pr_name("p5_BN_cmp");
454 pr_name("p5_BN_ucmp");
460 p5_BN_is_bit_set(a,b)
464 pr_name("p5_BN_is_bit_set");
465 RETVAL=BN_is_bit_set(a,b);
476 pr_name("p5_BN_set_bit");
478 PUSHs(sv_newmortal());
480 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
490 pr_name("p5_BN_clear_bit");
492 PUSHs(sv_newmortal());
494 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
504 pr_name("p5_BN_lshift");
506 PUSHs(sv_newmortal());
508 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
521 pr_name("p5_BN_rshift");
523 PUSHs(sv_newmortal());
525 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
538 pr_name("p5_BN_mask_bits");
540 PUSHs(sv_newmortal());
542 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
549 pr_name("p5_BN_clear");
557 static BN_CTX *ctx=NULL;
560 pr_name("p5_BN_gcd");
561 if (ctx == NULL) ctx=BN_CTX_new();
563 PUSHs(sv_newmortal());
565 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
569 p5_BN_mod_inverse(a,mod)
573 static BN_CTX *ctx=NULL;
576 pr_name("p5_BN_mod_inverse");
577 if (ctx == NULL) ctx=BN_CTX_new();
578 ret=BN_mod_inverse(a,mod,ctx);
580 PUSHs(sv_newmortal());
581 sv_setref_pv(ST(0), "SSLeay::BN", (void*)ret);
587 pr_name("p5_BN_DESTROY");