Class: CoBreak::GCrypt::BLAKE2B_256

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

Class Method Summary collapse

Class Method Details

.hexdigest(input) ⇒ Object



259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'ext/cobreak/cobreak_gcrypt.c', line 259

VALUE blake2b_256_hexdigest(VALUE self, VALUE input) {
    char *str = RSTRING_PTR(input);
    int length = RSTRING_LEN(input); // Obtener la longitud de la cadena
    unsigned char digest[32]; // BLAKE2b-256 produce un hash de 32 bytes (256 bits)
    char out[65]; // 32 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-256
    gcry_md_hd_t handle;
    gcry_md_open(&handle, GCRY_MD_BLAKE2B_256, 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_256), 32);
    gcry_md_close(handle);

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

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