using System.Security.Cryptography;
using System.Text.Json;
using XFESystem.Storage;
using XFESystem.StorageFixtures;
if(args.Length==3&&args[0]=="verify")
{
StorageReadback.Verify(Path.GetFullPath(args[1]),args[2]);return;
}
if(args.Length!=3||args[0]!="create")throw new ArgumentException("create <new fixture directory> <ordinary managed DLL> | verify <private proof directory> <token>");
string directory=Path.GetFullPath(args[1]);if(Directory.Exists(directory))throw new IOException("Fixture directory must be new.");Directory.CreateDirectory(directory);
byte[] sample=File.ReadAllBytes(args[2]);var results=new List<object>();
foreach(var spec in new[]{("NvmeNtfs",128,"NTFS"),("SataExtended",256,"NTFS"),("UsbExFat",128,"exFAT"),("Nvme4K",128,"NTFS")})
{
string path=Path.Combine(directory,spec.Item1+".img");using(var disk=new FixtureDisk(path,spec.Item1,true,spec.Item2*1024L*1024,spec.Item1=="Nvme4K"?4096:512))
{
var parts=spec.Item1=="SataExtended"?disk.ExtendedMbr():[disk.Gpt()];
foreach(var part in parts)disk.Format(part,part.Number==6?"FAT":spec.Item3,sample);
if(DiskPartitions.Read(disk).Length!=parts.Length)throw new IOException("Fixture partition parser disagrees.");
}
using var stream=File.OpenRead(path);results.Add(new{Path=path,Sha256=Convert.ToHexStringLower(SHA256.HashData(stream)),Kind=spec.Item1});
}
var receipt=new{Kind="XfeOtherDiskFixtures",Passed=true,HostOnly=true,PhysicalDiskAccess=false,ExternalProgramSha256=Convert.ToHexStringLower(SHA256.HashData(sample)),Images=results};
File.WriteAllText(Path.Combine(directory,"Manifest.json"),JsonSerializer.Serialize(receipt,new JsonSerializerOptions{WriteIndented=true}));Console.WriteLine(JsonSerializer.Serialize(receipt));
using System.Security.Cryptography;
using System.Text.Json;
using XFESystem.Storage;
using XFESystem.StorageFixtures;
if(args.Length==3&&args[0]=="verify")
{
StorageReadback.Verify(Path.GetFullPath(args[1]),args[2]);return;
}
if(args.Length!=3||args[0]!="create")throw new ArgumentException("create <new fixture directory> <ordinary managed DLL> | verify <private proof directory> <token>");
string directory=Path.GetFullPath(args[1]);if(Directory.Exists(directory))throw new IOException("Fixture directory must be new.");Directory.CreateDirectory(directory);
byte[] sample=File.ReadAllBytes(args[2]);var results=new List<object>();
foreach(var spec in new[]{("NvmeNtfs",128,"NTFS"),("SataExtended",256,"NTFS"),("UsbExFat",128,"exFAT"),("Nvme4K",128,"NTFS")})
{
string path=Path.Combine(directory,spec.Item1+".img");using(var disk=new FixtureDisk(path,spec.Item1,true,spec.Item2*1024L*1024,spec.Item1=="Nvme4K"?4096:512))
{
var parts=spec.Item1=="SataExtended"?disk.ExtendedMbr():[disk.Gpt()];
foreach(var part in parts)disk.Format(part,part.Number==6?"FAT":spec.Item3,sample);
if(DiskPartitions.Read(disk).Length!=parts.Length)throw new IOException("Fixture partition parser disagrees.");
}
using var stream=File.OpenRead(path);results.Add(new{Path=path,Sha256=Convert.ToHexStringLower(SHA256.HashData(stream)),Kind=spec.Item1});
}
var receipt=new{Kind="XfeOtherDiskFixtures",Passed=true,HostOnly=true,PhysicalDiskAccess=false,ExternalProgramSha256=Convert.ToHexStringLower(SHA256.HashData(sample)),Images=results};
File.WriteAllText(Path.Combine(directory,"Manifest.json"),JsonSerializer.Serialize(receipt,new JsonSerializerOptions{WriteIndented=true}));Console.WriteLine(JsonSerializer.Serialize(receipt));