The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
**	Perl Extension for the
**
**	RSA Data Security Inc. MD5 Message-Digest Algorithm
**
**	This module by Neil Winton (N.Winton@axion.bt.co.uk)
**	SCCS ID @(#)MD5.xs	1.7 96/06/28
**
**	This extension may be distributed under the same terms
**	as Perl. The MD5 code is covered by separate copyright and
**	licence, but this does not prohibit distribution under the
**	GNU or Artistic licences. See the file md5c.c or MD5.pm
**	for more details.
*/

#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "global.h"
#include "md5.h"

/*
** The following macro re-definitions added to work around a problem on
** Solaris where the original MD5 routines are already in /lib/libnsl.a.
** This causes dynamic linking of the module to fail.
** Thanks to Ken Pizzini (ken@spry.com) for finally nailing this one!
*/

#define MD5Init		MD5Init_perl
#define MD5Update	MD5Update_perl
#define MD5Final	MD5Final_perl

typedef MD5_CTX	*MD5;

#ifdef __cplusplus
}
#endif


MODULE = MD5		PACKAGE = MD5

PROTOTYPES: DISABLE

MD5
new(packname = "MD5")
	char *		packname
    CODE:
	{
	    RETVAL = (MD5_CTX *)safemalloc(sizeof(MD5_CTX));
	    MD5Init(RETVAL);
	}
    OUTPUT:
	RETVAL

void
DESTROY(context)
	MD5	context
    CODE:
	{
	    safefree((char *)context);
	}

void
reset(context)
	MD5	context
    CODE:
	{
	    MD5Init(context);
	}

void
add(context, ...)
	MD5	context
    CODE:
	{
	    SV *svdata;
	    STRLEN len;
	    unsigned char *data;
	    int i;

	    for (i = 1; i < items; i++)
	    {
		data = (unsigned char *)(SvPV(ST(i), len));
		MD5Update(context, data, len);
	    }
	}

SV *
digest(context)
	MD5	context
    CODE:
	{
	    unsigned char digeststr[16];

	    MD5Final(digeststr, context);
	    ST(0) = sv_2mortal(newSVpv((char *)digeststr, 16));
	}