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_
86 PUSHs(sv_newmortal());
88 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)bn);
98 PUSHs(sv_newmortal());
100 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)bn);
110 pr_name("p5_BN_rand");
111 if ((items < 1) || (items > 3))
112 croak("Usage: OpenSSL::BN::rand(bits[,top_bit][,bottombit]");
113 if (items >= 2) top=(int)SvIV(ST(0));
114 if (items >= 3) bottom=(int)SvIV(ST(1));
116 PUSHs(sv_newmortal());
118 BN_rand(ret,bits,top,bottom);
119 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
127 pr_name("p5_BN_bin2bn");
129 PUSHs(sv_newmortal());
130 ret=BN_bin2bn(a.dptr,a.dsize,NULL);
131 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
139 pr_name("p5_BN_bn2bin");
141 PUSHs(sv_newmortal());
143 sv_setpvn(ST(0),"",1);
145 SvCUR_set(ST(0),BN_bn2bin(a,SvPV_nolen(ST(0))));
153 pr_name("p5_BN_mpi2bn");
155 PUSHs(sv_newmortal());
156 ret=BN_mpi2bn(a.dptr,a.dsize,NULL);
157 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
165 pr_name("p5_BN_bn2mpi");
167 PUSHs(sv_newmortal());
169 sv_setpvn(ST(0),"",1);
171 SvCUR_set(ST(0),BN_bn2mpi(a,SvPV_nolen(ST(0))));
179 pr_name("p5_BN_hex2bn");
181 PUSHs(sv_newmortal());
183 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
184 BN_hex2bn(&ret,a.dptr);
192 pr_name("p5_BN_dec2bn");
194 PUSHs(sv_newmortal());
196 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
197 BN_dec2bn(&ret,a.dptr);
206 pr_name("p5_BN_bn2hex");
208 RETVAL=newSVpv("",0);
211 memcpy(SvPV_nolen(RETVAL),ptr,i+1);
224 pr_name("p5_BN_bn2dec");
226 RETVAL=newSVpv("",0);
229 memcpy(SvPV_nolen(RETVAL),ptr,i+1);
242 pr_name("p5_BN_add");
244 PUSHs(sv_newmortal());
246 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
256 pr_name("p5_BN_sub");
258 PUSHs(sv_newmortal());
260 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
268 static BN_CTX *ctx=NULL;
271 pr_name("p5_BN_mul");
272 if (ctx == NULL) ctx=BN_CTX_new();
274 PUSHs(sv_newmortal());
276 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
284 static BN_CTX *ctx=NULL;
287 pr_name("p5_BN_div");
288 if (ctx == NULL) ctx=BN_CTX_new();
290 PUSHs(sv_newmortal());
291 PUSHs(sv_newmortal());
294 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)div);
295 sv_setref_pv(ST(1), "OpenSSL::BN", (void*)mod);
296 BN_div(div,mod,a,b,ctx);
303 static BN_CTX *ctx=NULL;
306 pr_name("p5_BN_mod");
307 if (ctx == NULL) ctx=BN_CTX_new();
309 PUSHs(sv_newmortal());
311 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)rem);
320 static BN_CTX *ctx=NULL;
322 pr_name("p5_BN_exp");
323 if (ctx == NULL) ctx=BN_CTX_new();
325 PUSHs(sv_newmortal());
327 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
336 static BN_CTX *ctx=NULL;
339 pr_name("p5_BN_mod_mul");
340 if (ctx == NULL) ctx=BN_CTX_new();
342 PUSHs(sv_newmortal());
344 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
345 BN_mod_mul(ret,a,b,c,ctx);
353 static BN_CTX *ctx=NULL;
356 pr_name("p5_BN_mod_exp");
357 if (ctx == NULL) ctx=BN_CTX_new();
359 PUSHs(sv_newmortal());
361 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
362 BN_mod_exp(ret,a,b,c,ctx);
365 p5_BN_generate_prime(...)
376 pr_name("p5_BN_generate_prime");
377 if ((items < 0) || (items > 4))
378 croak("Usage: OpenSSL::BN::generate_prime(a[,strong][,callback][,cb_arg]");
379 if (items >= 1) bits=(int)SvIV(ST(0));
380 if (items >= 2) strong=(int)SvIV(ST(1));
381 if (items >= 3) callback=ST(2);
382 if (items == 4) cb_arg=ST(3);
384 if (callback == NULL)
385 ret=BN_generate_prime(ret,bits,strong,NULL,NULL,NULL,NULL);
391 ret=BN_generate_prime(ret,bits,strong,NULL,NULL,
392 generate_prime_callback,(char *)&arg);
396 sp-=items; /* a bit evil that I do this */
399 PUSHs(sv_newmortal());
400 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
403 p5_BN_is_prime(p,...)
411 static BN_CTX *ctx=NULL;
413 pr_name("p5_BN_is_prime");
414 if ((items < 1) || (items > 4))
415 croak("Usage: OpenSSL::BN::is_prime(a[,ncheck][,callback][,callback_arg]");
416 if (ctx == NULL) ctx=BN_CTX_new();
417 if (items >= 2) nchecks=(int)SvIV(ST(1));
418 if (items >= 3) callback=ST(2);
419 if (items >= 4) cb_arg=ST(3);
421 if (callback == NULL)
422 ret=BN_is_prime(p,nchecks,NULL,ctx,NULL);
427 ret=BN_is_prime(p,nchecks,generate_prime_callback,
431 sp-=items; /* a bit evil */
432 PUSHs(sv_2mortal(newSViv(ret)));
438 pr_name("p5_BN_num_bits");
439 RETVAL=BN_num_bits(a);
448 pr_name("p5_BN_cmp");
458 pr_name("p5_BN_ucmp");
464 p5_BN_is_bit_set(a,b)
468 pr_name("p5_BN_is_bit_set");
469 RETVAL=BN_is_bit_set(a,b);
480 pr_name("p5_BN_set_bit");
482 PUSHs(sv_newmortal());
484 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
494 pr_name("p5_BN_clear_bit");
496 PUSHs(sv_newmortal());
498 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
508 pr_name("p5_BN_lshift");
510 PUSHs(sv_newmortal());
512 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
525 pr_name("p5_BN_rshift");
527 PUSHs(sv_newmortal());
529 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
542 pr_name("p5_BN_mask_bits");
544 PUSHs(sv_newmortal());
546 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
553 pr_name("p5_BN_clear");
561 static BN_CTX *ctx=NULL;
564 pr_name("p5_BN_gcd");
565 if (ctx == NULL) ctx=BN_CTX_new();
567 PUSHs(sv_newmortal());
569 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
573 p5_BN_mod_inverse(a,mod)
577 static BN_CTX *ctx=NULL;
580 pr_name("p5_BN_mod_inverse");
581 if (ctx == NULL) ctx=BN_CTX_new();
582 ret=BN_mod_inverse(ret,a,mod,ctx);
584 PUSHs(sv_newmortal());
585 sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);
591 pr_name("p5_BN_DESTROY");