#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);