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;
}
|