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

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

Mac.xs.inc.tt @v0.056

dc830a6
 
 
 
 
 
 
33bdb40
 
04fdd19
dc830a6
 
 
 
 
 
 
 
615e54f
dc830a6
 
 
 
4a2b9bf
33bdb40
04fdd19
dc830a6
 
 
 
4a2b9bf
dc830a6
 
 
 
 
 
 
 
04fdd19
615e54f
33bdb40
 
dc830a6
b016410
dc830a6
4a2b9bf
 
 
 
dc830a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
615e54f
b016410
33bdb40
 
 
b016410
33bdb40
dc830a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33bdb40
 
 
 
dc830a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33bdb40
 
 
 
dc830a6
 
 
 
 
 
 
615e54f
dc830a6
 
 
 
 
808344d
 
 
 
 
 
 
 
 
 
 
 
 
 
33bdb40
 
 
 
808344d
 
 
 
 
 
 
615e54f
808344d
 
 
 
 
dc830a6
 
 
 
 
347b6ad
 
dc830a6
 
 
 
 
 
33bdb40
 
 
 
dc830a6
 
 
 
 
 
 
 
 
 
 
 
MODULE = CryptX         PACKAGE = Crypt::Mac::[%orig_name%]

[%comment%]

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

        id = 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 = 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);

        Newz(0, RETVAL, 1, struct [%lc_name%]_struct);
        if (!RETVAL) croak("FATAL: Newz failed");

[%-IF lc_name == 'pelican' || lc_name == 'poly1305' %]
        rv = [%lc_name%]_init(&RETVAL->state, k, (unsigned long)k_len);
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        rv = [%lc_name%]mac_init(&RETVAL->state, size, k, (unsigned long)k_len);
[%-ELSE%]
        rv = [%lc_name%]_init(&RETVAL->state, 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:
        Newz(0, RETVAL, 1, struct [%lc_name%]_struct);
        if (!RETVAL) croak("FATAL: Newz failed");
        Copy(&self->state, &RETVAL->state, 1, struct [%lc_name%]_struct);
    OUTPUT:
        RETVAL

void
_add_single(Crypt::Mac::[%orig_name%] self, SV * data)
    CODE:
    {
        int rv;
        STRLEN in_data_len;
        unsigned char *in_data;

        in_data = (unsigned char *)SvPVbyte(data, in_data_len);
        if (in_data_len>0) {
[%-IF lc_name == 'blake2s' || lc_name == 'blake2b' %]
          rv = [%lc_name%]mac_process(&self->state, in_data, (unsigned long)in_data_len);
[%-ELSE%]
          rv = [%lc_name%]_process(&self->state, in_data, (unsigned long)in_data_len);
[%-END%]
          if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_process failed: %s", error_to_string(rv));
        }
    }

SV *
mac(Crypt::Mac::[%orig_name%] self)
    CODE:
    {
        char mac[MAXBLOCKSIZE];
        unsigned long mac_len;
        int rv;

[%-IF lc_name == 'pelican' %]
        mac_len = 16;
        rv = [%lc_name%]_done(&self->state, (unsigned char*)mac);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        mac_len = sizeof(mac);
        rv = [%lc_name%]mac_done(&self->state, (unsigned char*)mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
[%-ELSE%]
        mac_len = sizeof(mac);
        rv = [%lc_name%]_done(&self->state, (unsigned char*)mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-END%]
        RETVAL = newSVpvn(mac, mac_len);
    }
    OUTPUT:
        RETVAL

SV *
b64mac(Crypt::Mac::[%orig_name%] self)
    CODE:
    {
        unsigned char mac[MAXBLOCKSIZE];
        unsigned long mac_len;
        int rv;
        unsigned long outlen;
        char mac_base64[MAXBLOCKSIZE*2 + 1];

[%-IF lc_name == 'pelican' %]
        mac_len = 16;
        rv = [%lc_name%]_done(&self->state, mac);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        mac_len = sizeof(mac);
        rv = [%lc_name%]mac_done(&self->state, mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
[%-ELSE%]
        mac_len = sizeof(mac);
        rv = [%lc_name%]_done(&self->state, mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-END%]
        outlen = sizeof(mac_base64);
        rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
        if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
        RETVAL = newSVpvn(mac_base64, outlen);
    }
    OUTPUT:
        RETVAL

SV *
b64umac(Crypt::Mac::[%orig_name%] self)
    CODE:
    {
        unsigned char mac[MAXBLOCKSIZE];
        unsigned long mac_len;
        int rv;
        unsigned long outlen;
        char mac_base64[MAXBLOCKSIZE*2 + 1];

[%-IF lc_name == 'pelican' %]
        mac_len = 16;
        rv = [%lc_name%]_done(&self->state, mac);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        mac_len = sizeof(mac);
        rv = [%lc_name%]mac_done(&self->state, mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
[%-ELSE%]
        mac_len = sizeof(mac);
        rv = [%lc_name%]_done(&self->state, mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-END%]
        outlen = sizeof(mac_base64);
        rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
        if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
        RETVAL = newSVpvn(mac_base64, outlen);
    }
    OUTPUT:
        RETVAL

SV *
hexmac(Crypt::Mac::[%orig_name%] self)
    CODE:
    {
        unsigned char mac[MAXBLOCKSIZE];
        unsigned long mac_len, i;
        int rv;
        char mac_hex[MAXBLOCKSIZE*2 + 1];

[%-IF lc_name == 'pelican' %]
        mac_len = 16;
        rv = [%lc_name%]_done(&self->state, mac);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-ELSIF lc_name == 'blake2s' || lc_name == 'blake2b' %]
        mac_len = sizeof(mac);
        rv = [%lc_name%]mac_done(&self->state, mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]mac_done failed: %s", error_to_string(rv));
[%-ELSE%]
        mac_len = sizeof(mac);
        rv = [%lc_name%]_done(&self->state, mac, &mac_len);
        if (rv != CRYPT_OK) croak("FATAL: [%lc_name%]_done failed: %s", error_to_string(rv));
[%-END%]
        mac_hex[0] = '\0';
        for(i=0; i<mac_len; i++)
            sprintf(&mac_hex[2*i], "%02x", mac[i]);
        RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
    }
    OUTPUT:
        RETVAL