102 lines
1.8 KiB
Plaintext
102 lines
1.8 KiB
Plaintext
/*
|
|
** 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));
|
|
}
|