⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 openssl_bn.xs

📁 一个用于点对点传输加密的工具包源码
💻 XS
字号:
#include "openssl.h"int sv_to_BIGNUM(var,arg,name)BIGNUM **var;SV *arg;char *name;	{	int ret=1;	if (sv_derived_from(arg,"OpenSSL::BN"))		{		IV tmp = SvIV((SV*)SvRV(arg));		*var = (BIGNUM *) tmp;		}	else if (SvIOK(arg)) {		SV *tmp=sv_newmortal();		*var=BN_new();		BN_set_word(*var,SvIV(arg));		sv_setref_pv(tmp,"OpenSSL::BN",(void*)*var);		}	else if (SvPOK(arg)) {		char *ptr;		STRLEN len;		SV *tmp=sv_newmortal();		*var=BN_new();		sv_setref_pv(tmp,"OpenSSL::BN", (void*)*var);		ptr=SvPV(arg,len);		SvGROW(arg,len+1);		ptr[len]='\0';		BN_dec2bn(var,ptr);		}	else		{		croak(name);		ret=0;		}	return(ret);	}typedef struct gpc_args_st {	SV *cb;	SV *arg;	} GPC_ARGS;static void generate_prime_callback(pos,num,arg)int pos;int num;char *arg;	{	dSP ;	int i;	GPC_ARGS *a=(GPC_ARGS *)arg;	ENTER ;	SAVETMPS ;	PUSHMARK(sp);	XPUSHs(sv_2mortal(newSViv(pos)));	XPUSHs(sv_2mortal(newSViv(num)));	XPUSHs(sv_2mortal(newSVsv(a->arg)));	PUTBACK;	i=perl_call_sv(a->cb,G_DISCARD);	SPAGAIN;	PUTBACK;	FREETMPS;	LEAVE;	}MODULE =  OpenSSL::BN	PACKAGE = OpenSSL::BN	PREFIX = p5_BN_PROTOTYPES: ENABLEVERSIONCHECK: DISABLEvoidp5_BN_new(...)	PREINIT:		BIGNUM *bn;		SV *arg;	PPCODE:		pr_name("p5_BN_new");		EXTEND(sp,1);		PUSHs(sv_newmortal());		bn=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)bn);voidp5_BN_dup(a)	BIGNUM *a;	PREINIT:		BIGNUM *bn;	PPCODE:		pr_name("p5_BN_dup");		EXTEND(sp,1);		PUSHs(sv_newmortal());		bn=BN_dup(a);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)bn);voidp5_BN_rand(bits,...)	int bits;	PREINIT:		int top=1;		int bottom=0;		BIGNUM *ret;	PPCODE:			pr_name("p5_BN_rand");		if ((items < 1) || (items > 3))			croak("Usage: OpenSSL::BN::rand(bits[,top_bit][,bottombit]");		if (items >= 2) top=(int)SvIV(ST(0));		if (items >= 3) bottom=(int)SvIV(ST(1));		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		BN_rand(ret,bits,top,bottom);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);voidp5_BN_bin2bn(a)	datum a;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_bin2bn");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_bin2bn(a.dptr,a.dsize,NULL);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);voidp5_BN_bn2bin(a)	BIGNUM *a;	PREINIT:		int i;	PPCODE:		pr_name("p5_BN_bn2bin");		EXTEND(sp,1);		PUSHs(sv_newmortal());		i=BN_num_bytes(a)+2;		sv_setpvn(ST(0),"",1);		SvGROW(ST(0),i+1);		SvCUR_set(ST(0),BN_bn2bin(a,SvPV(ST(0),na)));voidp5_BN_mpi2bn(a)	datum a;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_mpi2bn");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_mpi2bn(a.dptr,a.dsize,NULL);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);voidp5_BN_bn2mpi(a)	BIGNUM *a;	PREINIT:		int i;	PPCODE:		pr_name("p5_BN_bn2mpi");		EXTEND(sp,1);		PUSHs(sv_newmortal());		i=BN_bn2mpi(a,NULL);		sv_setpvn(ST(0),"",1);		SvGROW(ST(0),i+1);		SvCUR_set(ST(0),BN_bn2mpi(a,SvPV(ST(0),na)));voidp5_BN_hex2bn(a)	datum a;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_hex2bn");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_hex2bn(&ret,a.dptr);voidp5_BN_dec2bn(a)	datum a;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_dec2bn");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_dec2bn(&ret,a.dptr);SV *p5_BN_bn2hex(a)	BIGNUM *a;	PREINIT:		char *ptr;		int i;	CODE:		pr_name("p5_BN_bn2hex");		ptr=BN_bn2hex(a);		RETVAL=newSVpv("",0);		i=strlen(ptr);		SvGROW(RETVAL,i+1);		memcpy(SvPV(RETVAL,na),ptr,i+1);		SvCUR_set(RETVAL,i);		Free(ptr);	OUTPUT:		RETVALSV *p5_BN_bn2dec(a)	BIGNUM *a;	PREINIT:		char *ptr;		int i;	CODE:		pr_name("p5_BN_bn2dec");		ptr=BN_bn2dec(a);		RETVAL=newSVpv("",0);		i=strlen(ptr);		SvGROW(RETVAL,i+1);		memcpy(SvPV(RETVAL,na),ptr,i+1);		SvCUR_set(RETVAL,i);		Free(ptr);	OUTPUT:		RETVALvoidp5_BN_add(a,b)	BIGNUM *a;	BIGNUM *b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_add");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_add(ret,a,b);voidp5_BN_sub(a,b)	BIGNUM *a;	BIGNUM *b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_sub");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_sub(ret,a,b);voidp5_BN_mul(a,b)	BIGNUM *a;	BIGNUM *b;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_mul");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_mul(ret,a,b,ctx);voidp5_BN_div(a,b)	BIGNUM *a;	BIGNUM *b;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *div,*mod;	PPCODE:		pr_name("p5_BN_div");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,2);		PUSHs(sv_newmortal());		PUSHs(sv_newmortal());		div=BN_new();		mod=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)div);		sv_setref_pv(ST(1), "OpenSSL::BN", (void*)mod);		BN_div(div,mod,a,b,ctx);voidp5_BN_mod(a,b)	BIGNUM *a;	BIGNUM *b;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *rem;	PPCODE:		pr_name("p5_BN_mod");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,1);		PUSHs(sv_newmortal());		rem=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)rem);		BN_mod(rem,a,b,ctx);voidp5_BN_exp(a,p)	BIGNUM *a;	BIGNUM *p;	PREINIT:		BIGNUM *ret;		static BN_CTX *ctx=NULL;	PPCODE:		pr_name("p5_BN_exp");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_exp(ret,a,p,ctx);voidp5_BN_mod_mul(a,b,c)	BIGNUM *a;	BIGNUM *b;	BIGNUM *c;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_mod_mul");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_mod_mul(ret,a,b,c,ctx);voidp5_BN_mod_exp(a,b,c)	BIGNUM *a;	BIGNUM *b;	BIGNUM *c;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_mod_exp");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_mod_exp(ret,a,b,c,ctx);voidp5_BN_generate_prime(...)	PREINIT:		int bits=512;		int strong=0;		BIGNUM *ret=NULL;		SV *callback=NULL;		SV *cb_arg=NULL;		GPC_ARGS arg;		dSP;	PPCODE:		pr_name("p5_BN_generate_prime");		if ((items < 0) || (items > 4))			croak("Usage: OpenSSL::BN::generate_prime(a[,strong][,callback][,cb_arg]");		if (items >= 1) bits=(int)SvIV(ST(0));		if (items >= 2) strong=(int)SvIV(ST(1));		if (items >= 3) callback=ST(2);		if (items == 4) cb_arg=ST(3);		if (callback == NULL)			ret=BN_generate_prime(ret,bits,strong,NULL,NULL,NULL,NULL);		else			{			arg.cb=callback;			arg.arg=cb_arg;			ret=BN_generate_prime(ret,bits,strong,NULL,NULL,				generate_prime_callback,(char *)&arg);			}		SPAGAIN;		sp-=items; /* a bit evil that I do this */		EXTEND(sp,1);		PUSHs(sv_newmortal());		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);voidp5_BN_is_prime(p,...)	BIGNUM *p;	PREINIT:	int nchecks=5,ret;	SV *callback=NULL;	SV *cb_arg=NULL;	GPC_ARGS arg;	dSP;	static BN_CTX *ctx=NULL;	PPCODE:		pr_name("p5_BN_is_prime");		if ((items < 1) || (items > 4))			croak("Usage: OpenSSL::BN::is_prime(a[,ncheck][,callback][,callback_arg]");		if (ctx == NULL) ctx=BN_CTX_new();		if (items >= 2) nchecks=(int)SvIV(ST(1));		if (items >= 3) callback=ST(2);		if (items >= 4) cb_arg=ST(3);		arg.arg=cb_arg; 		if (callback == NULL)			ret=BN_is_prime(p,nchecks,NULL,ctx,NULL);		else			{			arg.cb=callback;			arg.arg=cb_arg;			ret=BN_is_prime(p,nchecks,generate_prime_callback,				ctx,(char *)&arg);			}		SPAGAIN;		sp-=items; /* a bit evil */		PUSHs(sv_2mortal(newSViv(ret)));intp5_BN_num_bits(a)	BIGNUM *a;	CODE:		pr_name("p5_BN_num_bits");		RETVAL=BN_num_bits(a);	OUTPUT:		RETVALintp5_BN_cmp(a,b)	BIGNUM *a;	BIGNUM *b;	CODE:		pr_name("p5_BN_cmp");		RETVAL=BN_cmp(a,b);	OUTPUT:		RETVALintp5_BN_ucmp(a,b)	BIGNUM *a;	BIGNUM *b;	CODE:		pr_name("p5_BN_ucmp");		RETVAL=BN_ucmp(a,b);	OUTPUT:		RETVALintp5_BN_is_bit_set(a,b)	BIGNUM *a;	int b;	CODE:		pr_name("p5_BN_is_bit_set");		RETVAL=BN_is_bit_set(a,b);	OUTPUT:		RETVALvoidp5_BN_set_bit(a,b)	BIGNUM *a;	int b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_set_bit");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_dup(a);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_set_bit(ret,b);voidp5_BN_clear_bit(a,b)	BIGNUM *a;	int b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_clear_bit");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_dup(a);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_clear_bit(ret,b);voidp5_BN_lshift(a,b)	BIGNUM *a;	int b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_lshift");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		if (b == 1)			BN_lshift1(ret,a);		else			BN_lshift(ret,a,b);voidp5_BN_rshift(a,b)	BIGNUM *a;	int b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_rshift");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		if (b == 1)			BN_rshift1(ret,a);		else			BN_rshift(ret,a,b);voidp5_BN_mask_bits(a,b)	BIGNUM *a;	int b;	PREINIT:		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_mask_bits");		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_dup(a);		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_mask_bits(ret,b);voidp5_BN_clear(a)	BIGNUM *a;	PPCODE:		pr_name("p5_BN_clear");		BN_clear(a);voidp5_BN_gcd(a,b)	BIGNUM *a;	BIGNUM *b;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_gcd");		if (ctx == NULL) ctx=BN_CTX_new();		EXTEND(sp,1);		PUSHs(sv_newmortal());		ret=BN_new();		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);		BN_gcd(ret,a,b,ctx);voidp5_BN_mod_inverse(a,mod)	BIGNUM *a;	BIGNUM *mod;	PREINIT:		static BN_CTX *ctx=NULL;		BIGNUM *ret;	PPCODE:		pr_name("p5_BN_mod_inverse");		if (ctx == NULL) ctx=BN_CTX_new();		ret=BN_mod_inverse(ret,a,mod,ctx);		EXTEND(sp,1);		PUSHs(sv_newmortal());		sv_setref_pv(ST(0), "OpenSSL::BN", (void*)ret);voidp5_BN_DESTROY(bn)	BIGNUM *bn	CODE:	pr_name("p5_BN_DESTROY");	BN_free(bn);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -