Digest-Skein

 view release on metacpan or  search on metacpan

Skein.xs  view on Meta::CPAN

typedef Skein1024_Ctxt_t  * Digest__Skein__1024;

MODULE = Digest::Skein          PACKAGE = Digest::Skein         

PROTOTYPES: ENABLE

char *
Skein(hashbitlen, data)
		int   hashbitlen
		const BitSequence *     data
	PPCODE:
		if (hashbitlen < 0)
			croak("hashbitlen < 0");
	{
		BitSequence     hashval[128];
		char ret[256 + 1];
		int i;
		if ( Hash( hashbitlen, data, (DataLength) SvCUR(ST(1)) * 8, hashval ) != SUCCESS )
			croak("Hash() failed");
		for (i=0; i<hashbitlen/8; i++)
			sprintf(&ret[2*i], "%02X", hashval[i]);
		ST(0) = sv_2mortal(newSVpv(ret, hashbitlen/4));
		XSRETURN(1);
	}

char *
skein_256(data)
		const BitSequence *     data
	PPCODE:
	{
		BitSequence hashval[256/8];
		if ( Hash( 256, data, (DataLength) SvCUR(ST(0)) * 8, hashval ) != SUCCESS )
			croak("Hash(256) failed");
		ST(0) = sv_2mortal(newSVpv(hashval, 256/8));
		XSRETURN(1);
	}

char *
skein_512(data)
		const BitSequence *     data
	PPCODE:
	{
		char hashval[512/8];
		if ( Hash( 512, data, (DataLength) SvCUR(ST(0)) * 8, hashval ) != SUCCESS )
			croak("Hash(512) failed");
		ST(0) = sv_2mortal(newSVpv(hashval, 512/8));
		XSRETURN(1);
	}

char *
skein_1024(data)
		const BitSequence *     data
	PPCODE:
	{
		char hashval[1024/8];
		if ( Hash( 1024, data, (DataLength) SvCUR(ST(0)) * 8, hashval ) != SUCCESS )
			croak("Hash(1024) failed");
		ST(0) = sv_2mortal(newSVpv(hashval, 1024/8));
		XSRETURN(1);
	}


MODULE = Digest::Skein          PACKAGE = Digest::Skein::256

Skein.xs  view on Meta::CPAN

		Newx(dest, 1, Skein_256_Ctxt_t);
		memcpy(dest, ctx, sizeof(*dest));
		RETVAL = dest;
	OUTPUT:
		RETVAL

Digest::Skein::256
new(package, hashbitlen=256)
		SV* package
		int hashbitlen
	PPCODE:
		if (hashbitlen > 256)
			croak("hashbitlen > 256");
		if (SvROK(package)) {	/* called as $digest->new or $digest->reset */
			IV tmp;
			Digest__Skein__256	ctx;
			if (! sv_derived_from(package, "Digest::Skein::256"))
				croak("meh.");
			tmp = SvIV((SV*)SvRV(package));
			ctx = INT2PTR(Digest__Skein__256, tmp);
			if ( Skein_256_Init( ctx, items==2 ? hashbitlen : ctx->h.hashBitLen ) != SUCCESS )

Skein.xs  view on Meta::CPAN

		int i;
		for (i=1; i<items; i++)
			if ( Skein_256_Update(ctx, (const u08b_t *)SvPV_nolen(ST(i)), SvCUR(ST(i))) != SUCCESS )
				croak("Update() failed");
		RETVAL = ctx;
	}

char *
digest(ctx)
		Digest::Skein::256  ctx
	PPCODE:
	{
		char hashval[256/8];
		int len = (ctx->h.hashBitLen + 7) >> 3;
		if ( Skein_256_Final(ctx, hashval) != SUCCESS )
			croak("final() failed");
		if ( Skein_256_Init(ctx, ctx->h.hashBitLen) != SUCCESS ) /* reset */
			croak("Init() failed");
		ST(0) = sv_2mortal(newSVpv(hashval, len));
		XSRETURN(1);
	}

Skein.xs  view on Meta::CPAN

		Newx(dest, 1, Skein_512_Ctxt_t);
		memcpy(dest, ctx, sizeof(*dest));
		RETVAL = dest;
	OUTPUT:
		RETVAL

Digest::Skein::512
new(package, hashbitlen=512)
		SV* package
		int hashbitlen
	PPCODE:
		if (hashbitlen > 512)
			croak("hashbitlen > 512");
		if (SvROK(package)) {	/* called as $digest->new or $digest->reset */
			IV tmp;
			Digest__Skein__512	ctx;
			if (! sv_derived_from(package, "Digest::Skein::512"))
				croak("meh.");
			tmp = SvIV((SV*)SvRV(package));
			ctx = INT2PTR(Digest__Skein__512, tmp);
			if ( Skein_512_Init( ctx, items==2 ? hashbitlen : ctx->h.hashBitLen ) != SUCCESS )

Skein.xs  view on Meta::CPAN

		int i;
		for (i=1; i<items; i++)
			if ( Skein_512_Update(ctx, (const u08b_t *)SvPV_nolen(ST(i)), SvCUR(ST(i))) != SUCCESS )
				croak("Update() failed");
		RETVAL = ctx;
	}

char *
digest(ctx)
		Digest::Skein::512  ctx
	PPCODE:
	{
		char hashval[512/8];
		int len = (ctx->h.hashBitLen + 7) >> 3;
		if ( Skein_512_Final(ctx, hashval) != SUCCESS )
			croak("final() failed");
		if ( Skein_512_Init(ctx, ctx->h.hashBitLen) != SUCCESS ) /* reset */
			croak("Init() failed");
		ST(0) = sv_2mortal(newSVpv(hashval, len));
		XSRETURN(1);
	}

Skein.xs  view on Meta::CPAN

		Newx(dest, 1, Skein1024_Ctxt_t);
		memcpy(dest, ctx, sizeof(*dest));
		RETVAL = dest;
	OUTPUT:
		RETVAL

Digest::Skein::1024
new(package, hashbitlen=1024)
		SV* package
		int hashbitlen
	PPCODE:
		if (hashbitlen > 1024)
			croak("hashbitlen > 1024");
		if (SvROK(package)) {	/* called as $digest->new or $digest->reset */
			IV tmp;
			Digest__Skein__1024	ctx;
			if (! sv_derived_from(package, "Digest::Skein::1024"))
				croak("meh.");
			tmp = SvIV((SV*)SvRV(package));
			ctx = INT2PTR(Digest__Skein__1024, tmp);
			if ( Skein1024_Init( ctx, items==2 ? hashbitlen : ctx->h.hashBitLen ) != SUCCESS )

Skein.xs  view on Meta::CPAN

		int i;
		for (i=1; i<items; i++)
			if ( Skein1024_Update(ctx, (const u08b_t *)SvPV_nolen(ST(i)), SvCUR(ST(i))) != SUCCESS )
				croak("Update() failed");
		RETVAL = ctx;
	}

char *
digest(ctx)
		Digest::Skein::1024  ctx
	PPCODE:
	{
		char hashval[1024/8];
		int len = (ctx->h.hashBitLen + 7) >> 3;
		if ( Skein1024_Final(ctx, hashval) != SUCCESS )
			croak("final() failed");
		if ( Skein1024_Init(ctx, ctx->h.hashBitLen) != SUCCESS ) /* reset */
			croak("Init() failed");
		ST(0) = sv_2mortal(newSVpv(hashval, len));
		XSRETURN(1);
	}



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