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

📄 openssl_cipher.xs

📁 一个用于点对点传输加密的工具包源码
💻 XS
字号:
#include "openssl.h"int boot_cipher()	{        SSLeay_add_all_ciphers();	return(1);	}MODULE =  OpenSSL::Cipher	PACKAGE = OpenSSL::Cipher PREFIX = p5_EVP_C_PROTOTYPES: ENABLEVERSIONCHECK: DISABLEvoidp5_EVP_C_new(...)	PREINIT:		EVP_CIPHER_CTX *ctx;		const EVP_CIPHER *c;		char *name;	PPCODE:		if ((items == 1) && SvPOK(ST(0)))			name=SvPV(ST(0),na);		else if ((items == 2) && SvPOK(ST(1)))			name=SvPV(ST(1),na);		else			croak("Usage: OpenSSL::Cipher::new(type)");		PUSHs(sv_newmortal());		c=EVP_get_cipherbyname(name);		if (c != NULL)			{			ctx=malloc(sizeof(EVP_CIPHER_CTX));			EVP_EncryptInit(ctx,c,NULL,NULL);			sv_setref_pv(ST(0), "OpenSSL::Cipher", (void*)ctx);			}datump5_EVP_C_name(ctx)	EVP_CIPHER_CTX *ctx	CODE:		RETVAL.dptr=OBJ_nid2ln(EVP_CIPHER_CTX_nid(ctx));		RETVAL.dsize=strlen(RETVAL.dptr);	OUTPUT:		RETVALintp5_EVP_C_key_length(ctx)	EVP_CIPHER_CTX *ctx	CODE:		RETVAL=EVP_CIPHER_CTX_key_length(ctx);	OUTPUT:		RETVALintp5_EVP_C_iv_length(ctx)	EVP_CIPHER_CTX *ctx	CODE:		RETVAL=EVP_CIPHER_CTX_iv_length(ctx);	OUTPUT:		RETVAL	intp5_EVP_C_block_size(ctx)	EVP_CIPHER_CTX *ctx	CODE:		RETVAL=EVP_CIPHER_CTX_block_size(ctx);	OUTPUT:		RETVAL	voidp5_EVP_C_init(ctx,key,iv,enc)	EVP_CIPHER_CTX *ctx	datum key	datum iv	int enc	PREINIT:		char loc_iv[EVP_MAX_IV_LENGTH];		char loc_key[EVP_MAX_KEY_LENGTH];		char *ip=loc_iv,*kp=loc_key;		int i;		memset(loc_iv,0,EVP_MAX_IV_LENGTH);		memset(loc_key,0,EVP_MAX_KEY_LENGTH);	CODE:		i=key.dsize;		if (key.dsize > EVP_CIPHER_CTX_key_length(ctx))			i=EVP_CIPHER_CTX_key_length(ctx);		if (i > 0)			{			memset(kp,0,EVP_MAX_KEY_LENGTH);			memcpy(kp,key.dptr,i);			}		else			kp=NULL;		i=iv.dsize;		if (iv.dsize > EVP_CIPHER_CTX_iv_length(ctx))			i=EVP_CIPHER_CTX_iv_length(ctx);		if (i > 0)			{			memcpy(ip,iv.dptr,i);			memset(ip,0,EVP_MAX_IV_LENGTH);			}		else			ip=NULL;		EVP_CipherInit(ctx,EVP_CIPHER_CTX_cipher(ctx),kp,ip,enc);		memset(loc_key,0,sizeof(loc_key));		memset(loc_iv,0,sizeof(loc_iv));SV *p5_EVP_C_cipher(ctx,in)	EVP_CIPHER_CTX *ctx;	datum in;	CODE:		RETVAL=newSVpv("",0);		SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);		EVP_Cipher(ctx,SvPV(RETVAL,na),in.dptr,in.dsize);		SvCUR_set(RETVAL,in.dsize);	OUTPUT:		RETVALSV *p5_EVP_C_update(ctx, in)	EVP_CIPHER_CTX *ctx	datum in	PREINIT:	int i;	CODE:		RETVAL=newSVpv("",0);		SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);		EVP_CipherUpdate(ctx,SvPV(RETVAL,na),&i,in.dptr,in.dsize);		SvCUR_set(RETVAL,i);	OUTPUT:		RETVALSV *p5_EVP_C_final(ctx)	EVP_CIPHER_CTX *ctx	PREINIT:	int i;	CODE:		RETVAL=newSVpv("",0);		SvGROW(RETVAL,EVP_CIPHER_CTX_block_size(ctx)+1);		if (!EVP_CipherFinal(ctx,SvPV(RETVAL,na),&i))			sv_setpv(RETVAL,"BAD DECODE");		else			SvCUR_set(RETVAL,i);	OUTPUT:		RETVALvoidp5_EVP_C_DESTROY(ctx)	EVP_CIPHER_CTX *ctx	CODE:	free((char *)ctx);

⌨️ 快捷键说明

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