Class: CoBreak::GCrypt::WHIRLPOOL

Inherits:
Object
  • Object
show all
Defined in:
ext/cobreak/cobreak_gcrypt.c

Class Method Summary collapse

Class Method Details

.hexdigest(input) ⇒ Object



355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
# File 'ext/cobreak/cobreak_gcrypt.c', line 355

VALUE whirlpool_hexdigest(VALUE self, VALUE input) {
    // Convertir el valor Ruby a una cadena C
    char *str = RSTRING_PTR(input);
    int length = RSTRING_LEN(input); // Obtener la longitud de la cadena
    unsigned char digest[64]; // Whirlpool produce un hash de 64 bytes
    char out[129]; // 64 bytes * 2 para hexadecimal + 1 para el terminador

    // Inicializar la biblioteca de Libgcrypt
    if (!gcry_check_version(GCRYPT_VERSION)) {
        rb_raise(rb_eRuntimeError, "No se pudo inicializar la biblioteca Libgcrypt");
    }

    // Inicializar el contexto de hashing
    gcry_md_hd_t handle;
    if (gcry_md_open(&handle, GCRY_MD_WHIRLPOOL, 0) != 0) {
        rb_raise(rb_eRuntimeError, "No se pudo abrir el contexto de hashing");
    }

    // Calcular el hash Whirlpool
    gcry_md_write(handle, str, length);
    memcpy(digest, gcry_md_read(handle, 0), 64); // Leer el hash

    // Cerrar el contexto
    gcry_md_close(handle);

    // Convertir el hash a una cadena hexadecimal
    for (int n = 0; n < 64; ++n) {
        sprintf(&(out[n * 2]), "%02x", (unsigned int)digest[n]);
    }
    out[128] = '\0'; // Terminar la cadena

    VALUE result = rb_str_new2(out); // Crear una nueva cadena Ruby
    return result;
}