Crypt-RIPEMD160

 view release on metacpan or  search on metacpan

RIPEMD160.xs  view on Meta::CPAN

/*
Perl Extension for the RIPEMD160 Message-Digest Algorithm

This module by Christian H. Geuer <christian.geuer@crypto.gun.de>
following example of MD5 module and SHA module.

This extension (wrapper code and perl-stuff) may be distributed
under the same terms as Perl.
*/

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "wrap_160.h"

MODULE = Crypt::RIPEMD160	PACKAGE = Crypt::RIPEMD160	PREFIX = rmd160_

PROTOTYPES: DISABLE

Crypt::RIPEMD160
rmd160_new(packname = "Crypt::RIPEMD160")
	char *		packname
    CODE:
	{
	    PERL_UNUSED_VAR(packname);
	    RETVAL = (Crypt__RIPEMD160) safemalloc(sizeof(RIPEMD160_INFO));
	    RIPEMD160_init(RETVAL);
	}
    OUTPUT:
	RETVAL


void
rmd160_DESTROY(ripemd160)
	Crypt::RIPEMD160	ripemd160
    CODE:
	{
	    secure_memzero(ripemd160, sizeof(RIPEMD160_INFO));
	    safefree((char *) ripemd160);
	}


void
reset(ripemd160)
	Crypt::RIPEMD160	ripemd160
    PPCODE:
	{
	    RIPEMD160_init(ripemd160);
	    /* return self for method chaining */
	    XSRETURN(1);
	}

Crypt::RIPEMD160
rmd160_clone(ripemd160)
	Crypt::RIPEMD160	ripemd160
    CODE:
	{
	    RETVAL = (Crypt__RIPEMD160) safemalloc(sizeof(RIPEMD160_INFO));
	    memcpy(RETVAL, ripemd160, sizeof(RIPEMD160_INFO));
	}
    OUTPUT:
	RETVAL


void
rmd160_add(ripemd160, ...)
	Crypt::RIPEMD160	ripemd160
    PPCODE:
	{
	    STRLEN len;
	    byte *strptr;
	    int i;

	    for (i = 1; i < items; i++) {
		strptr = (byte *) (SvPVbyte(ST(i), len));
#if PTRSIZE > 4
		/* STRLEN is 64-bit on 64-bit systems but RIPEMD160_update
		   takes a 32-bit dword length; chunk to avoid truncation */
		while (len > (STRLEN)0xFFFFFFFFU) {
		    RIPEMD160_update(ripemd160, strptr, (dword)0xFFFFFFFFU);
		    strptr += 0xFFFFFFFFU;
		    len -= 0xFFFFFFFFU;
		}
#endif
		RIPEMD160_update(ripemd160, strptr, (dword)len);
	    }
	    /* return self for method chaining */
	    XSRETURN(1);
	}

SV *
rmd160_digest(ripemd160)
	Crypt::RIPEMD160	ripemd160
    CODE:
	{
	    unsigned char d_str[20];
	    int i;

	    RIPEMD160_final(ripemd160);

	    for (i = 0; i < 5; i++) {
		d_str[4*i  ] = (unsigned char)(ripemd160->MDbuf[i]       & 0xff);
		d_str[4*i+1] = (unsigned char)(ripemd160->MDbuf[i] >>  8 & 0xff);
		d_str[4*i+2] = (unsigned char)(ripemd160->MDbuf[i] >> 16 & 0xff);
		d_str[4*i+3] = (unsigned char)(ripemd160->MDbuf[i] >> 24 & 0xff);
	    }

	    RETVAL = newSVpvn((const char *)d_str, 20);
	}
    OUTPUT:
	RETVAL



( run in 0.964 second using v1.01-cache-2.11-cpan-71847e10f99 )