/** * g_hmac_copy: * @hmac: the #GHmac to copy * * Copies a #GHmac. If @hmac has been closed, by calling * g_hmac_get_string() or g_hmac_get_digest(), the copied * HMAC will be closed as well. * * Returns: the copy of the passed #GHmac. Use g_hmac_unref() * when finished using it. * * Since: 2.30 */ GHmac * g_hmac_copy (const GHmac *hmac) { GHmac *copy; g_return_val_if_fail (hmac != NULL, NULL); copy = g_slice_new (GHmac); copy->ref_count = 1; copy->digest_type = hmac->digest_type; copy->digesti = g_checksum_copy (hmac->digesti); copy->digesto = g_checksum_copy (hmac->digesto); return copy; }
void TagDigest(void *ctx, char *digest) { const char *hex; GChecksum *tmp; tmp = g_checksum_copy(ctx); hex = g_checksum_get_string(tmp); strcpy(digest, hex); g_checksum_free(tmp); }
RmDigest *rm_digest_copy(RmDigest *digest) { g_assert(digest); RmDigest *self = NULL; switch(digest->type) { case RM_DIGEST_MD5: case RM_DIGEST_SHA512: case RM_DIGEST_SHA256: case RM_DIGEST_SHA1: self = g_slice_new0(RmDigest); self->bytes = digest->bytes; self->type = digest->type; self->glib_checksum = g_checksum_copy(digest->glib_checksum); break; case RM_DIGEST_PARANOID: case RM_DIGEST_SPOOKY: case RM_DIGEST_SPOOKY32: case RM_DIGEST_SPOOKY64: case RM_DIGEST_MURMUR: case RM_DIGEST_CITY: case RM_DIGEST_CITY256: case RM_DIGEST_MURMUR256: case RM_DIGEST_CITY512: case RM_DIGEST_MURMUR512: case RM_DIGEST_BASTARD: case RM_DIGEST_CUMULATIVE: self = rm_digest_new( digest->type, digest->initial_seed1, digest->initial_seed2, digest->bytes ); if(self->type == RM_DIGEST_PARANOID) { self->paranoid_offset = digest->paranoid_offset; rm_digest_free(self->shadow_hash); self->shadow_hash = rm_digest_copy(digest->shadow_hash); } if(self->checksum && digest->checksum) { memcpy((char *)self->checksum, (char *)digest->checksum, self->bytes); } break; default: g_assert_not_reached(); } return self; }
RmDigest *rm_digest_copy(RmDigest *digest) { rm_assert_gentle(digest); RmDigest *self = NULL; switch(digest->type) { case RM_DIGEST_MD5: case RM_DIGEST_SHA512: case RM_DIGEST_SHA256: case RM_DIGEST_SHA1: self = g_slice_new0(RmDigest); self->bytes = digest->bytes; self->type = digest->type; self->glib_checksum = g_checksum_copy(digest->glib_checksum); break; case RM_DIGEST_SPOOKY: case RM_DIGEST_SPOOKY32: case RM_DIGEST_SPOOKY64: case RM_DIGEST_MURMUR: case RM_DIGEST_CITY: case RM_DIGEST_CITY256: case RM_DIGEST_MURMUR256: case RM_DIGEST_CITY512: case RM_DIGEST_MURMUR512: case RM_DIGEST_XXHASH: case RM_DIGEST_FARMHASH: case RM_DIGEST_BASTARD: case RM_DIGEST_CUMULATIVE: case RM_DIGEST_EXT: self = rm_digest_new(digest->type, 0, 0, digest->bytes, FALSE); if(self->checksum && digest->checksum) { memcpy((char *)self->checksum, (char *)digest->checksum, self->bytes); } break; case RM_DIGEST_PARANOID: default: rm_assert_gentle_not_reached(); } return self; }
void fs_uae_load_rom_files(const char *path) { fs_log("fs_uae_load_rom_files %s\n", path); GDir *dir = g_dir_open(path, 0, NULL); if (dir == NULL) { fs_log("error opening dir\n"); return; } // we include the rom key when generating the cache name for the // kickstart cache file, so the cache will be regenerated if rom.key // is replaced or removed/added. char *key_path = g_build_filename(path, "rom.key", NULL); GChecksum *rom_checksum = g_checksum_new(G_CHECKSUM_MD5); FILE *f = g_fopen(key_path, "rb"); if (f != NULL) { int64_t key_size = fs_path_get_size(key_path); if (key_size > 0 && key_size < 1024 * 1024) { guchar *key_data = malloc(key_size); if (fread(key_data, key_size, 1, f) != 1) { free(key_data); } else { fs_log("read rom key file, size = %d\n", key_size); g_checksum_update(rom_checksum, key_data, key_size); } } fclose(f); } g_free(key_path); amiga_add_key_dir(path); const char *name = g_dir_read_name(dir); while (name) { char *lname = g_utf8_strdown(name, -1); if (g_str_has_suffix(lname, ".rom") || g_str_has_suffix(lname, ".bin")) { fs_log("found file \"%s\"\n", name); char *full_path = g_build_filename(path, name, NULL); //GChecksum *checksum = g_checksum_new(G_CHECKSUM_MD5); GChecksum *checksum = g_checksum_copy(rom_checksum); g_checksum_update( checksum, (guchar *) full_path, strlen(full_path)); const gchar *cache_name = g_checksum_get_string(checksum); char* cache_path = g_build_filename( fs_uae_kickstarts_cache_dir(), cache_name, NULL); amiga_add_rom_file(full_path, cache_path); // check if amiga_add_rom_file needs to own full_path //free(full_path); if (cache_path != NULL) { free(cache_path); } g_checksum_free(checksum); } free(lname); name = g_dir_read_name(dir); } g_dir_close(dir); if (rom_checksum != NULL) { g_checksum_free(rom_checksum); } //exit(1); }