mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
95ffe86dbc
His own words are: The patch adds no new functionality (other than a simple test package) to the libraries, but it allows them to be compiled with Perl5.6.0. It has only been tested under "Red Hat Linux release 7.0 (Guinness)" with the unpatched verion of OpenSSL 0.9.6 released last September.
155 lines
2.9 KiB
Plaintext
155 lines
2.9 KiB
Plaintext
|
|
#include "openssl.h"
|
|
|
|
int boot_cipher()
|
|
{
|
|
SSLeay_add_all_ciphers();
|
|
return(1);
|
|
}
|
|
|
|
MODULE = OpenSSL::Cipher PACKAGE = OpenSSL::Cipher PREFIX = p5_EVP_C_
|
|
|
|
PROTOTYPES: ENABLE
|
|
VERSIONCHECK: DISABLE
|
|
|
|
void
|
|
p5_EVP_C_new(...)
|
|
PREINIT:
|
|
EVP_CIPHER_CTX *ctx;
|
|
const EVP_CIPHER *c;
|
|
char *name;
|
|
PPCODE:
|
|
if ((items == 1) && SvPOK(ST(0)))
|
|
name=SvPV_nolen(ST(0));
|
|
else if ((items == 2) && SvPOK(ST(1)))
|
|
name=SvPV_nolen(ST(1));
|
|
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);
|
|
}
|
|
|
|
datum
|
|
p5_EVP_C_name(ctx)
|
|
EVP_CIPHER_CTX *ctx
|
|
CODE:
|
|
RETVAL.dptr=OBJ_nid2ln(EVP_CIPHER_CTX_nid(ctx));
|
|
RETVAL.dsize=strlen(RETVAL.dptr);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
int
|
|
p5_EVP_C_key_length(ctx)
|
|
EVP_CIPHER_CTX *ctx
|
|
CODE:
|
|
RETVAL=EVP_CIPHER_CTX_key_length(ctx);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
int
|
|
p5_EVP_C_iv_length(ctx)
|
|
EVP_CIPHER_CTX *ctx
|
|
CODE:
|
|
RETVAL=EVP_CIPHER_CTX_iv_length(ctx);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
int
|
|
p5_EVP_C_block_size(ctx)
|
|
EVP_CIPHER_CTX *ctx
|
|
CODE:
|
|
RETVAL=EVP_CIPHER_CTX_block_size(ctx);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
void
|
|
p5_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_nolen(RETVAL),in.dptr,in.dsize);
|
|
SvCUR_set(RETVAL,in.dsize);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
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_nolen(RETVAL),&i,in.dptr,in.dsize);
|
|
SvCUR_set(RETVAL,i);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
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_nolen(RETVAL),&i))
|
|
sv_setpv(RETVAL,"BAD DECODE");
|
|
else
|
|
SvCUR_set(RETVAL,i);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
void
|
|
p5_EVP_C_DESTROY(ctx)
|
|
EVP_CIPHER_CTX *ctx
|
|
CODE:
|
|
free((char *)ctx);
|
|
|