packages feed

canontra-0.1.0.0: src/Canontra/Fingerprint/ControlFlow.hs

{- |
Module      : Canontra.Fingerprint.ControlFlow
Description : Cryptographic fingerprint tier for Control-Flow Graphs (F_CF).

Computes F_CF by hashing the deterministic canonical binary representation
of all basic blocks and branching topology in the module after normalization.
-}
module Canontra.Fingerprint.ControlFlow
  ( computeFCF
  ) where

import Canontra.Analysis.CFG (buildCFGs)
import Canontra.Canonical.Serialize (canonicalizeCFGs)
import Canontra.Fingerprint.Source (hashBytes)
import Canontra.IR.Program (Program)
import Canontra.Normalize.Normalize (normalizeProgram)
import Canontra.Types (Fingerprint)

-- | Compute the F_CF control-flow fingerprint for a Program.
computeFCF :: Program -> Fingerprint
computeFCF prog =
  let normProg = normalizeProgram prog
      cfgs = buildCFGs normProg
      canonicalBytes = canonicalizeCFGs cfgs
  in hashBytes canonicalBytes