30 lines
4.4 KiB
JavaScript
30 lines
4.4 KiB
JavaScript
// Controlul negativ al SBOM-urilor .NET si Gradle (sbom-nuget-gradle.test.mjs, Proof of Software 1.5.0), prin mecanismul comun din
|
|
// _control.mjs: fiecare paznic scos intr-o copie a lui pos.mjs trebuie sa inroseasca EXACT proba lui, cu suita chiar rulata.
|
|
// node aerenew/tools/proof-of-software/test/sbom-nuget-gradle-control-negativ.mjs
|
|
import { controleaza } from './_control.mjs';
|
|
|
|
process.exitCode = await controleaza('sbom-nuget-gradle.test.mjs', [
|
|
['contentHash-ul NuGet scos din componenta', "'aere:nuget-content-hash': 'sha512-' + p.hash,", "'aere:nuget-content-hash': null,", 'CONTROL POZITIV al metodei: fiecare hash din SBOM'],
|
|
['un tip necunoscut de intrare NuGet primit', 'if (!e || !NUGET_TIPURI.has(e.type)) throw', 'if (!e) throw', 'CONTROL: un lockfile .NET stricat'],
|
|
['doua hash-uri pentru acelasi pachet primite', 'if (p.hash !== e.contentHash) throw', 'if (false) throw', 'CONTROL: un lockfile .NET stricat'],
|
|
['muchiile pachet -> dependinta nu mai sunt scrise', 'for (const dn of Object.keys(e.dependencies || {})) muchii.push([refDe([n, e]), refDe(rezolva(dn))]);', '', 'nuget: graful din lockfile'],
|
|
['radacina nu mai depinde de directe si de proiect', "if (e.type === 'Direct' || e.type === 'Project') muchii.push([root, refDe([n, e])]);", '', 'nuget: graful din lockfile'],
|
|
['SBOM-urile .NET si Gradle judecate ca npm la reconstructie', 'const din = derivatDin(atestat), ver =', 'const din = null, ver =', "verify --rebuild-from: SBOM-ul .NET"],
|
|
['SBOM-ul Gradle judecat ca npm la reconstructie', "fel === 'gradle' ? sbomGradleFromTree", "fel === 'gradle-niciodata' ? sbomGradleFromTree", 'verify --rebuild-from: SBOM-ul Gradle'],
|
|
['hash-urile jar-ului principal nu mai sunt scrise', '...(hashes.length ? { hashes } : {}), properties };', '...({}), properties };', 'gradle: cinci componente'],
|
|
['o coordonata blocata fara hash nu mai e semnalata', "...(!c.arte.length ? [{ name: 'aere:gradle-no-checksum', value: 'true' }] : []),", '...([]),', 'CONTROL: o coordonata blocata fara hash'],
|
|
['regulile trusted-artifacts nu mai sunt numarate', "if (t.open === 'trust' && stiva.includes('configuration')) reguliIncredere++;", 'if (false) reguliIncredere++;', 'CONTROL: regulile care slabesc'],
|
|
// B-22 (2026-09-30): cititorul liniar; fiecare garda de structura scoasa trebuie sa inroseasca proba ei
|
|
['o componenta fara coordonate primita', 'if (!a.group || !a.name || !a.version) throw', 'if (false) throw', 'CONTROL: verification-metadata cu o componenta necitita'],
|
|
['o componenta in afara <components> primita', "if (sus !== 'components') throw", 'if (false) throw', 'B-22 CONTROL: structura pe care cititorul nu o stie'],
|
|
['taguri incrucisate primite', 'if (scos !== t.close) throw', 'if (false) throw', 'B-22 CONTROL: structura pe care cititorul nu o stie'],
|
|
['un comentariu neinchis inghite restul in tacere', "if (e === -1) throw new Error(`${unde}: a comment is not closed`);", 'if (e === -1) break;', 'B-22 CONTROL: structura pe care cititorul nu o stie'],
|
|
// forma veche, patratica, a atributelor si a radacinii (masurat pe ea: 6,9 s si 5 s)
|
|
['atributele citite iar cu expresia patratica', 'out.push({ open: nume, attrs: atributeXml(corp.slice(k), unde), self });', 'out.push({ open: nume, attrs: Object.fromEntries([...corp.slice(k).matchAll(/([A-Za-z_][\\w.-]*)\\s*=\\s*"([^"]*)"/g)].map((m) => [m[1], m[2]])), self });', 'B-22: citirea costa LINIAR'],
|
|
['radacina din settings.gradle citita iar cu \\s* sub /m', "export const RADACINA_GRADLE = /^[ \\t]*rootProject", "export const RADACINA_GRADLE = /^\\s*rootProject", 'B-22: citirea costa LINIAR'],
|
|
['configuratiile din gradle.lockfile pierdute', "c.configuratii = m[4].split(',').filter(Boolean).sort(); coord.set(k, c);", 'c.configuratii = []; coord.set(k, c);', 'gradle: configuratiile din gradle.lockfile'],
|
|
['numarul de serie aleator (SBOM-ul nu mai e determinist)', 'serialNumber: serieDerivata({ metadata, components, dependencies }),', "serialNumber: 'urn:uuid:' + crypto.randomUUID(),", 'determinist'],
|
|
['componentele fara purl numite name@version in forma semantica', "const comp = (c) => ({ purl: c.purl || c['bom-ref'] || `${c.name}@${c.version}`,", 'const comp = (c) => ({ purl: c.purl || `${c.name}@${c.version}`,', 'forma semantica: componentele fara purl'],
|
|
['doua fisiere de proiect: primul ales in tacere', 'if (proj.length !== 1) return { lipsa:', 'if (proj.length < 1) return { lipsa:', 'un arbore fara lockfile / cu doua proiecte'],
|
|
]);
|