📄 sha.xs
字号:
#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#include <src/sha.c>#include <src/hmac.c>static int ix2alg[] = {1,1,1,224,224,224,256,256,256,384,384,384,512,512,512};MODULE = Digest::SHA PACKAGE = Digest::SHA PROTOTYPES: ENABLE#include <src/sha.h>#include <src/hmac.h>#ifndef INT2PTR#define INT2PTR(p, i) (p) (i)#endifintshaclose(s) SHA * sintshadump(file, s) char * file SHA * sSHA *shadup(s) SHA * sSHA *shaload(file) char * fileSHA *shaopen(alg) int algvoidsharewind(s) SHA * sunsigned longshawrite(bitstr, bitcnt, s) unsigned char * bitstr unsigned long bitcnt SHA * svoidsha1(...)ALIAS: Digest::SHA::sha1 = 0 Digest::SHA::sha1_hex = 1 Digest::SHA::sha1_base64 = 2 Digest::SHA::sha224 = 3 Digest::SHA::sha224_hex = 4 Digest::SHA::sha224_base64 = 5 Digest::SHA::sha256 = 6 Digest::SHA::sha256_hex = 7 Digest::SHA::sha256_base64 = 8 Digest::SHA::sha384 = 9 Digest::SHA::sha384_hex = 10 Digest::SHA::sha384_base64 = 11 Digest::SHA::sha512 = 12 Digest::SHA::sha512_hex = 13 Digest::SHA::sha512_base64 = 14PREINIT: int i; unsigned char *data; STRLEN len; SHA *state; char *result;PPCODE: if ((state = shaopen(ix2alg[ix])) == NULL) XSRETURN_UNDEF; for (i = 0; i < items; i++) { data = (unsigned char *) (SvPV(ST(i), len)); shawrite(data, len << 3, state); } shafinish(state); len = 0; if (ix % 3 == 0) { result = (char *) shadigest(state); len = shadsize(state); } else if (ix % 3 == 1) result = shahex(state); else result = shabase64(state); ST(0) = sv_2mortal(newSVpv(result, len)); shaclose(state); XSRETURN(1);voidhmac_sha1(...)ALIAS: Digest::SHA::hmac_sha1 = 0 Digest::SHA::hmac_sha1_hex = 1 Digest::SHA::hmac_sha1_base64 = 2 Digest::SHA::hmac_sha224 = 3 Digest::SHA::hmac_sha224_hex = 4 Digest::SHA::hmac_sha224_base64 = 5 Digest::SHA::hmac_sha256 = 6 Digest::SHA::hmac_sha256_hex = 7 Digest::SHA::hmac_sha256_base64 = 8 Digest::SHA::hmac_sha384 = 9 Digest::SHA::hmac_sha384_hex = 10 Digest::SHA::hmac_sha384_base64 = 11 Digest::SHA::hmac_sha512 = 12 Digest::SHA::hmac_sha512_hex = 13 Digest::SHA::hmac_sha512_base64 = 14PREINIT: int i; unsigned char *key; unsigned char *data; STRLEN len; HMAC *state; char *result;PPCODE: key = (unsigned char *) (SvPV(ST(items-1), len)); if ((state = hmacopen(ix2alg[ix], key, len)) == NULL) XSRETURN_UNDEF; for (i = 0; i < items - 1; i++) { data = (unsigned char *) (SvPV(ST(i), len)); hmacwrite(data, len << 3, state); } hmacfinish(state); len = 0; if (ix % 3 == 0) { result = (char *) hmacdigest(state); len = shadsize(state->osha); } else if (ix % 3 == 1) result = hmachex(state); else result = hmacbase64(state); ST(0) = sv_2mortal(newSVpv(result, len)); hmacclose(state); XSRETURN(1);voidhashsize(self) SV * selfALIAS: Digest::SHA::hashsize = 0 Digest::SHA::algorithm = 1PREINIT: SHA *state; int result;PPCODE: state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); result = shadsize(state) << 3; if (ix == 1 && result == 160) result = 1; ST(0) = sv_2mortal(newSViv(result)); XSRETURN(1);voidadd(self, ...) SV * selfPREINIT: int i; unsigned char *data; STRLEN len; SHA *state;PPCODE: state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); for (i = 1; i < items; i++) { data = (unsigned char *) (SvPV(ST(i), len)); shawrite(data, len << 3, state); } XSRETURN(1);voiddigest(self) SV * selfALIAS: Digest::SHA::digest = 0 Digest::SHA::Hexdigest = 1 Digest::SHA::B64digest = 2PREINIT: STRLEN len; SHA *state; char *result;PPCODE: state = INT2PTR(SHA *, SvIV(SvRV(SvRV(self)))); shafinish(state); len = 0; if (ix == 0) { result = (char *) shadigest(state); len = shadsize(state); } else if (ix == 1) result = shahex(state); else result = shabase64(state); ST(0) = sv_2mortal(newSVpv(result, len)); sharewind(state); XSRETURN(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -