openssl/perl/openssl_digest.xs

85 lines
1.5 KiB
Plaintext
Raw Normal View History

#include "openssl.h"
int boot_digest()
{
SSLeay_add_all_digests();
return(1);
}
MODULE = OpenSSL::MD PACKAGE = OpenSSL::MD PREFIX = p5_EVP_MD_
PROTOTYPES: ENABLE
VERSIONCHECK: DISABLE
# OpenSSL::MD::new(name) name= md2, md5, sha, sha1, or mdc2
# md->name() - returns the name
# md->init() - reinitalises the digest
# md->update(data) - adds more data to digest
# digest=md->final() - returns digest
#
void
p5_EVP_MD_new(...)
PREINIT:
EVP_MD_CTX *ctx;
EVP_MD *md;
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::MD::new(type)");
PUSHs(sv_newmortal());
md=EVP_get_digestbyname(name);
if (md != NULL)
{
ctx=malloc(sizeof(EVP_MD_CTX));
EVP_DigestInit(ctx,md);
sv_setref_pv(ST(0), "OpenSSL::MD", (void*)ctx);
}
datum
p5_EVP_MD_name(ctx)
EVP_MD_CTX *ctx
CODE:
RETVAL.dptr=OBJ_nid2ln(EVP_MD_type(EVP_MD_CTX_type(ctx)));
RETVAL.dsize=strlen(RETVAL.dptr);
OUTPUT:
RETVAL
void
p5_EVP_MD_init(ctx)
EVP_MD_CTX *ctx
CODE:
EVP_DigestInit(ctx,EVP_MD_CTX_type(ctx));
void
p5_EVP_MD_update(ctx, in)
EVP_MD_CTX *ctx
datum in
CODE:
EVP_DigestUpdate(ctx,in.dptr,in.dsize);
datum
p5_EVP_MD_final(ctx)
EVP_MD_CTX *ctx
PREINIT:
char md[EVP_MAX_MD_SIZE];
int len;
CODE:
EVP_DigestFinal(ctx,md,&len);
RETVAL.dptr=md;
RETVAL.dsize=len;
OUTPUT:
RETVAL
void
p5_EVP_MD_DESTROY(ctx)
EVP_MD_CTX *ctx
CODE:
free((char *)ctx);