Class: CoBreak::GCrypt::BLAKE2B_160

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

Class Method Summary collapse

Class Method Details

.hexdigest(input) ⇒ Object



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'ext/cobreak/cobreak_gcrypt.c', line 161

VALUE blake2b_160_hexdigest(VALUE self, VALUE input) {
    char *str = RSTRING_PTR(input);
    int length = RSTRING_LEN(input); // Obtener la longitud de la cadena
    unsigned char digest[20]; // BLAKE2b-160 produce un hash de 20 bytes (160 bits)
    char out[41]; // 20 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-160
    gcry_md_hd_t handle;
    gcry_md_open(&handle, GCRY_MD_BLAKE2B_160, 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_160), 20);
    gcry_md_close(handle);

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

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