Class: CoBreak::GCrypt::BLAKE2B_512

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

Class Method Summary collapse

Class Method Details

.hexdigest(input) ⇒ Object



323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
# File 'ext/cobreak/cobreak_gcrypt.c', line 323

VALUE blake2b_512_hexdigest(VALUE self, VALUE input) {
    char *str = RSTRING_PTR(input);
    int length = RSTRING_LEN(input); // Obtener la longitud de la cadena
    unsigned char digest[64]; // BLAKE2b-512 produce un hash de 64 bytes (512 bits)
    char out[129]; // 64 bytes * 2 para hexadecimal + 1 para el terminador

    // Inicializar la biblioteca libgcrypt
    if (!gcry_check_version(GCRYPT_VERSION)) {
        rb_raise(rb_eRuntimeError, "VersiĆ³n de libgcrypt no compatible.");
    }

    // Abrir el contexto de hash para BLAKE2b-512
    gcry_md_hd_t handle;
    gcry_md_open(&handle, GCRY_MD_BLAKE2B_512, 0);
    
    // Actualizar el hash con la cadena de entrada
    gcry_md_write(handle, str, length);
    
    // Finalizar el hash y obtener el resultado
    memcpy(digest, gcry_md_read(handle, GCRY_MD_BLAKE2B_512), 64);
    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;
}