summaryrefslogtreecommitdiff
path: root/src/analysis/contents/restricted.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/contents/restricted.c')
-rw-r--r--src/analysis/contents/restricted.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/analysis/contents/restricted.c b/src/analysis/contents/restricted.c
index a8f1763..e342242 100644
--- a/src/analysis/contents/restricted.c
+++ b/src/analysis/contents/restricted.c
@@ -66,6 +66,9 @@ static void g_restricted_content_dispose(GRestrictedContent *);
/* Procède à la libération totale de la mémoire. */
static void g_restricted_content_finalize(GRestrictedContent *);
+/* Calcule une empreinte unique (SHA256) pour les données. */
+static void g_restricted_content_compute_checksum(GRestrictedContent *, GChecksum *);
+
/* Donne accès à une portion des données représentées. */
static const bin_t *g_restricted_content_get_raw_access(const GRestrictedContent *, vmpa2t *, phys_t);
@@ -156,6 +159,8 @@ static void g_restricted_content_init(GRestrictedContent *content)
static void g_restricted_content_interface_init(GBinContentInterface *iface)
{
+ iface->compute_checksum = (compute_checksum_fc)g_restricted_content_compute_checksum;
+
iface->get_raw_access = (get_raw_access_fc)g_restricted_content_get_raw_access;
iface->read_raw = (read_raw_fc)g_restricted_content_read_raw;
@@ -242,6 +247,43 @@ GBinContent *g_restricted_content_new(GBinContent *content, const mrange_t *rang
/******************************************************************************
* *
+* Paramètres : content = contenu binaire à venir lire. *
+* checksum = empreinte de zone mémoire à compléter. *
+* *
+* Description : Calcule une empreinte unique (SHA256) pour les données. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_restricted_content_compute_checksum(GRestrictedContent *content, GChecksum *checksum)
+{
+ vmpa2t start; /* Point de départ */
+ phys_t i; /* Boucle de parcours */
+ vmpa2t iter; /* Tête de lecture */
+ const bin_t *byte; /* Octet de données à intégrer */
+
+ copy_vmpa(&start, get_mrange_addr(&content->range));
+
+ for (i = 0; i < get_mrange_length(&content->range); i++)
+ {
+ copy_vmpa(&iter, &start);
+ advance_vmpa(&iter, i);
+
+ byte = g_binary_content_get_raw_access(G_BIN_CONTENT(content->internal), &iter, 1);
+
+ if (byte != NULL)
+ g_checksum_update(checksum, byte, 1);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : content = contenu binaire à venir lire. *
* addr = position de la tête de lecture. *
* length = quantité d'octets à lire. *