# SPDX-License-Identifier: MIT """Read-only descriptor density of selected, independently audited shadows.""" import hashlib import struct def collect(processes, names, audited_roots, first, allocated, read): if not 1 <= len(names) <= 4 or len(set(names)) != len(names): raise ValueError('invalid density process selection') if (first | allocated) & 4095 or not 0 < first < allocated: raise ValueError('invalid density arena bounds') roots = {r['root']: r for r in audited_roots} if len(roots) != len(audited_roots): raise ValueError('duplicate audited roots') private = {int(p, 16) for r in audited_roots for p in r['private_table_pages']} selected = [] for name in names: matches = [p for p in processes if p['name'] == name] if len(matches) != 1: raise ValueError('density process is absent or ambiguous') process = matches[0] root = process.get('user_address_space', {}).get('root') if root not in roots: raise ValueError('density process has no audited root binding') row = roots[root] pages = [int(p, 16) for p in row['canonical_table_pages']] if (not 1 <= len(pages) <= 1024 or len(set(pages)) != len(pages) or int(row['canonical'], 16) not in pages or any(p & 4095 or not first <= p <= allocated-4096 or p in private for p in pages)): raise ValueError('invalid or aliased density source pages') selected.append((process, row, pages)) cached = {} rows = [] for process, root, pages in selected: zero_words = zero_groups = 0 digest = hashlib.sha256() for pa in pages: if pa not in cached: raw = read(pa, 4096) if len(raw) != 4096: raise ValueError('short density table read') cached[pa] = raw raw = cached[pa];digest.update(struct.pack('