Codebase list libcryptx-perl / v0.076 _generators / Mac.xs.inc.tt
v0.076

Tree @v0.076 (Download .tar.gz)

Mac.xs.inc.tt @v0.076

dc830a6
 
da585c2
 
dc830a6
 
 
 
e8df411
33bdb40
e8df411
04fdd19
e8df411
dc830a6
e8df411
dc830a6
 
 
 
 
615e54f
dc830a6
 
 
d23527c
4a2b9bf
33bdb40
04fdd19
dc830a6
 
 
d23527c
4a2b9bf
dc830a6
 
 
 
 
8bd1e9d
 
 
 
 
dc830a6
 
04fdd19
8bd1e9d
33bdb40
8bd1e9d
dc830a6
8bd1e9d
dc830a6
4a2b9bf
 
 
 
dc830a6
 
 
 
 
 
 
 
 
 
 
 
8bd1e9d
 
dc830a6
8bd1e9d
 
 
 
 
 
dc830a6
 
 
 
71011c2
 
dc830a6
71011c2
dc830a6
 
 
71011c2
 
 
33bdb40
8bd1e9d
33bdb40
8bd1e9d
33bdb40
71011c2
 
dc830a6
71011c2
dc830a6
 
 
 
71011c2
 
 
 
dc830a6
 
 
611fb98
347b6ad
1e9bd50
dc830a6
 
611fb98
8bd1e9d
dc830a6
33bdb40
611fb98
8bd1e9d
33bdb40
dc830a6
611fb98
8bd1e9d
dc830a6
 
611fb98
71011c2
b0e1718
71011c2
 
 
 
b0e1718
71011c2
 
 
 
b0e1718
71011c2
 
 
 
71c5bc4
71011c2
b3740fd
 
 
 
 
 
71011c2
b3740fd
71011c2
b3740fd
71011c2
b3740fd
71011c2
b3740fd
71011c2
 
 
 
b3740fd
 
 
71011c2
b3740fd
71011c2
b3740fd
 
 
71011c2
 
b3740fd
71011c2
b3740fd
 
 
d23527c
b3740fd
71c5bc4
71011c2
 
 
 
71c5bc4
71011c2
 
 
 
 
b3740fd
 
71c5bc4
71011c2
 
 
 
71c5bc4
71011c2
 
 
 
 
b3740fd
 
71c5bc4
71011c2
 
 
 
71c5bc4
71011c2
 
 
 
 
b3740fd
71c5bc4
71011c2
 
 
 
71c5bc4
71011c2
 
 
 
 
b3740fd
d23527c
b3740fd
71c5bc4
71011c2
 
 
 
71c5bc4
71011c2
 
 
 
 
b3740fd
 
 
71011c2
b0e1718
71011c2
 
 
 
b0e1718
71011c2
b0e1718
71011c2
 
b0e1718
71011c2
b0e1718
71011c2
 
 
 
b3740fd
 
 
MODULE = CryptX         PACKAGE = Crypt::Mac::[%orig_name%]

PROTOTYPES: DISABLE

[%comment%]

Crypt::Mac::[%orig_name%]
[%-IF lc_name == 'hmac' %]
new(Class, char * hash_name, SV * key)
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
new(Class, unsigned long size, SV * key)
[%-ELSIF lc_name == 'pelican' || lc_name == 'poly1305' %]
new(Class, SV * key)
[%-ELSE%]
new(Class, char * cipher_name, SV * key)
[%-END%]
    CODE:
    {
        STRLEN k_len=0;
        unsigned char *k=NULL;
        int rv;
[%-IF lc_name == 'hmac' %]
        int id;

        id = cryptx_internal_find_hash(hash_name);
        if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
[%-ELSIF lc_name == 'pelican' || lc_name == 'poly1305' %]
[%-ELSE%]
        int id;

        id = cryptx_internal_find_cipher(cipher_name);
        if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
[%-END%]

        if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
        k = (unsigned char *) SvPVbyte(key, k_len);

[%-IF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        Newz(0, RETVAL, 1, [%lc_name%]mac_state);
[%-ELSE%]
        Newz(0, RETVAL, 1, [%lc_name%]_state);
[%-END%]
        if (!RETVAL) croak("FATAL: Newz failed");

[%-IF lc_name == 'pelican' || lc_name == 'poly1305' %]
        rv = [%lc_name%]_init(RETVAL, k, (unsigned long)k_len);
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        rv = [%lc_name%]mac_init(RETVAL, size, k, (unsigned long)k_len);
[%-ELSE%]
        rv = [%lc_name%]_init(RETVAL, id, k, (unsigned long)k_len);
[%-END%]
        if (rv != CRYPT_OK) {
          Safefree(RETVAL);
          croak("FATAL: [%lc_name%]_init failed: %s", error_to_string(rv));
        }
    }
    OUTPUT:
        RETVAL

void
DESTROY(Crypt::Mac::[%orig_name%] self)
    CODE:
        Safefree(self);

Crypt::Mac::[%orig_name%]
clone(Crypt::Mac::[%orig_name%] self)
    CODE:
[%-IF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        Newz(0, RETVAL, 1, [%lc_name%]mac_state);
        if (!RETVAL) croak("FATAL: Newz failed");
        Copy(self, RETVAL, 1, [%lc_name%]mac_state);
[%-ELSE%]
        Newz(0, RETVAL, 1, [%lc_name%]_state);
        if (!RETVAL) croak("FATAL: Newz failed");
        Copy(self, RETVAL, 1, [%lc_name%]_state);
[%-END%]
    OUTPUT:
        RETVAL

void
add(Crypt::Mac::[%orig_name%] self, ...)
    PPCODE:
    {
        int rv, i;
        STRLEN in_data_len;
        unsigned char *in_data;

        for(i = 1; i < items; i++) {
          in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
          if (in_data_len > 0) {
[%-IF lc_name == 'blake2s' || lc_name == 'blake2b' %]
            rv = [%lc_name%]mac_process(self, in_data, (unsigned long)in_data_len);
[%-ELSE%]
            rv = [%lc_name%]_process(self, in_data, (unsigned long)in_data_len);
[%-END%]
            if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_process failed: %s", error_to_string(rv));
          }
        }
        XPUSHs(ST(0)); /* return self */
    }

SV *
mac(Crypt::Mac::[%orig_name%] self)
    ALIAS:
        hexmac  = 1
        b64mac  = 2
        b64umac = 3
    CODE:
    {
        unsigned char mac[MAXBLOCKSIZE];
        unsigned long maclen, outlen;
        int rv;
        char out[MAXBLOCKSIZE*2+1];

[%-IF lc_name == 'pelican' %]
        maclen = 16;
        rv = [%lc_name%]_done(self, mac);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        maclen = sizeof(mac);
        rv = [%lc_name%]mac_done(self, mac, &maclen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
[%-ELSE%]
        maclen = sizeof(mac);
        rv = [%lc_name%]_done(self, mac, &maclen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-END%]
        outlen = sizeof(out);
        if (ix == 3) {
          rv = base64url_encode(mac, maclen, out, &outlen);
          if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
          RETVAL = newSVpvn(out, outlen);
        }
        if (ix == 2) {
          rv = base64_encode(mac, maclen, out, &outlen);
          if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
          RETVAL = newSVpvn(out, outlen);
        }
        if (ix == 1) {
          rv = base16_encode(mac, maclen, out, &outlen, 0);
          if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
          RETVAL = newSVpvn(out, outlen);
        }
        else {
          RETVAL = newSVpvn((char * )mac, maclen);
        }
    }
    OUTPUT:
        RETVAL

SV *
[%-IF lc_name == 'hmac' %]
[%lc_name%](char * hash_name, SV * key, ...)
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
[%lc_name%](unsigned long size, SV * key, ...)
[%-ELSIF lc_name == 'pelican' || lc_name == 'poly1305' %]
[%lc_name%](SV * key, ...)
[%-ELSE%]
[%lc_name%](char * cipher_name, SV * key, ...)
[%-END%]
    ALIAS:
        [%lc_name%]_hex  = 1
        [%lc_name%]_b64  = 2
        [%lc_name%]_b64u = 3
    CODE:
    {
        STRLEN inlen, klen;
        unsigned char *in;
        unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
        int rv, i;
        unsigned char mac[MAXBLOCKSIZE];
        unsigned long len = sizeof(mac), outlen;
        char out[MAXBLOCKSIZE*2];
[%-IF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        [%lc_name%]mac_state st;
[%-ELSE%]
        [%lc_name%]_state st;
[%-END%]

[%-IF lc_name == 'hmac' %]
        int id = cryptx_internal_find_hash(hash_name);
        if (id == -1) croak("FATAL: find_digest failed for '%s'", hash_name);
        rv = [%lc_name%]_init(&st, id, k, (unsigned long)klen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_init failed: %s", error_to_string(rv));
        for (i = 2; i < items; i++) {
          in = (unsigned char *)SvPVbyte(ST(i), inlen);
          if (inlen > 0) {
            rv = [%lc_name%]_process(&st, in, (unsigned long)inlen);
            if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_process failed: %s", error_to_string(rv));
          }
        }
        rv = [%lc_name%]_done(&st, mac, &len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        if (size < len) len = size;
        rv = [%lc_name%]mac_init(&st, len, k, (unsigned long)klen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_init failed: %s", error_to_string(rv));
        for (i = 2; i < items; i++) {
          in = (unsigned char *)SvPVbyte(ST(i), inlen);
          if (inlen > 0) {
            rv = [%lc_name%]mac_process(&st, in, (unsigned long)inlen);
            if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_process failed: %s", error_to_string(rv));
          }
        }
        rv = [%lc_name%]mac_done(&st, mac, &len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'pelican' %]
        len = 16;
        rv = [%lc_name%]_init(&st, k, (unsigned long)klen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_init failed: %s", error_to_string(rv));
        for (i = 1; i < items; i++) {
          in = (unsigned char *)SvPVbyte(ST(i), inlen);
          if (inlen > 0) {
            rv = [%lc_name%]_process(&st, in, (unsigned long)inlen);
            if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_process failed: %s", error_to_string(rv));
          }
        }
        rv = [%lc_name%]_done(&st, mac);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'poly1305' %]
        rv = [%lc_name%]_init(&st, k, (unsigned long)klen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_init failed: %s", error_to_string(rv));
        for (i = 1; i < items; i++) {
          in = (unsigned char *)SvPVbyte(ST(i), inlen);
          if (inlen > 0) {
            rv = [%lc_name%]_process(&st, in, (unsigned long)inlen);
            if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_process failed: %s", error_to_string(rv));
          }
        }
        rv = [%lc_name%]_done(&st, mac, &len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSE%]
        int id = cryptx_internal_find_cipher(cipher_name);
        if (id == -1) croak("FATAL: find_cipher failed for '%s'", cipher_name);
        rv = [%lc_name%]_init(&st, id, k, (unsigned long)klen);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_init failed: %s", error_to_string(rv));
        for (i = 2; i < items; i++) {
          in = (unsigned char *)SvPVbyte(ST(i), inlen);
          if (inlen > 0) {
            rv = [%lc_name%]_process(&st, in, (unsigned long)inlen);
            if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_process failed: %s", error_to_string(rv));
          }
        }
        rv = [%lc_name%]_done(&st, mac, &len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-END%]

        outlen = sizeof(out);
        if (ix == 3) {
          rv = base64url_encode(mac, len, out, &outlen);
          if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
          RETVAL = newSVpvn((char *) out, outlen);
        }
        else if (ix == 2) {
          rv = base64_encode(mac, len, out, &outlen);
          if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
          RETVAL = newSVpvn(out, outlen);
        }
        else if (ix == 1) {
          rv = base16_encode(mac, len, out, &outlen, 0);
          if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
          RETVAL = newSVpvn(out, outlen);
        }
        else {
          RETVAL = newSVpvn((char *) mac, len);
        }
    }
    OUTPUT:
        RETVAL