95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# File 'ext/cobreak/cobreak_gcrypt.c', line 95
VALUE blake2s_128_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[16]; // BLAKE2s-128 produce un hash de 16 bytes
char out[33]; // 16 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 BLAKE2s-128
gcry_md_hd_t handle;
gcry_md_open(&handle, GCRY_MD_BLAKE2S_128, 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_BLAKE2S_128), 16);
gcry_md_close(handle);
// Convertir el hash a una cadena hexadecimal
for (int n = 0; n < 16; ++n) {
sprintf(&(out[n * 2]), "%02x", (unsigned int)digest[n]);
}
out[32] = '\0'; // Terminar la cadena
VALUE result = rb_str_new2(out); // Crear una nueva cadena Ruby
return result;
}
|