Digest-GOST

 view release on metacpan or  search on metacpan

GOST.xs  view on Meta::CPAN

        ret = result;
        break;
    case 2:
        len = base64_encode(result, src, len);
        ret = result;
        break;
    }
    return sv_2mortal(newSVpv(ret, len));
}

typedef gost_ctx *Digest__GOST;
typedef gost_ctx *Digest__GOST__CryptoPro;

MODULE = Digest::GOST    PACKAGE = Digest::GOST

PROTOTYPES: ENABLE

void
gost (...)
ALIAS:
    gost = 0
    gost_hex = 1
    gost_base64 = 2
PREINIT:
    gost_ctx ctx;
    int i;
    unsigned char *data;
    unsigned char result[32];
    STRLEN len;
CODE:
    rhash_gost_init(&ctx);
    for (i = 0; i < items; i++) {
        data = (unsigned char *)(SvPV(ST(i), len));
        rhash_gost_update(&ctx, data, len);
    }
    rhash_gost_final(&ctx, result);
    ST(0) = make_mortal_sv(aTHX_ result, 32, ix);
    XSRETURN(1);

Digest::GOST
new (class)
    SV *class
CODE:
    Newx(RETVAL, 1, gost_ctx);
    rhash_gost_init(RETVAL);
OUTPUT:
    RETVAL

Digest::GOST
clone (self)
    Digest::GOST self
CODE:
    Newx(RETVAL, 1, gost_ctx);
    Copy(self, RETVAL, 1, gost_ctx);
OUTPUT:
    RETVAL

void
reset (self)
    Digest::GOST self
PPCODE:
    rhash_gost_init(self);
    XSRETURN(1);

void
add (self, ...)
    Digest::GOST self
PREINIT:
    int i;
    unsigned char *data;
    STRLEN len;
PPCODE:
    for (i = 1; i < items; i++) {
        data = (unsigned char *)(SvPV(ST(i), len));
        rhash_gost_update(self, data, len);
    }
    XSRETURN(1);

void
digest (self)
    Digest::GOST self
ALIAS:
    digest = 0
    hexdigest = 1
    b64digest = 2
PREINIT:
    unsigned char result[32];
CODE:
    rhash_gost_final(self, result);
    rhash_gost_init(self);
    ST(0) = make_mortal_sv(aTHX_ result, 32, ix);
    XSRETURN(1);

void
DESTROY (self)
    Digest::GOST self
CODE:
    Safefree(self);

MODULE = Digest::GOST   PACKAGE = Digest::GOST::CryptoPro

void
gost (...)
ALIAS:
    gost = 0
    gost_hex = 1
    gost_base64 = 2
PREINIT:
    gost_ctx ctx;
    int i;
    unsigned char *data;
    unsigned char result[32];
    STRLEN len;
CODE:
    rhash_gost_cryptopro_init(&ctx);
    for (i = 0; i < items; i++) {
        data = (unsigned char *)(SvPV(ST(i), len));
        rhash_gost_update(&ctx, data, len);
    }
    rhash_gost_final(&ctx, result);
    ST(0) = make_mortal_sv(aTHX_ result, 32, ix);
    XSRETURN(1);

Digest::GOST::CryptoPro
new (class)
    SV *class
CODE:
    Newx(RETVAL, 1, gost_ctx);
    rhash_gost_cryptopro_init(RETVAL);
OUTPUT:
    RETVAL

void
reset (self)
    Digest::GOST::CryptoPro self
PPCODE:
    rhash_gost_cryptopro_init(self);
    XSRETURN(1);

void
digest (self)
    Digest::GOST::CryptoPro self
ALIAS:
    digest = 0
    hexdigest = 1
    b64digest = 2
PREINIT:
    unsigned char result[32];
CODE:
    rhash_gost_final(self, result);
    rhash_gost_cryptopro_init(self);
    ST(0) = make_mortal_sv(aTHX_ result, 32, ix);
    XSRETURN(1);



( run in 2.100 seconds using v1.01-cache-2.11-cpan-71847e10f99 )