local privkey_path = ".potatos_dsk"
if not fs.exists(privkey_path) then
	error("Please save the potatOS disk signing key (or alternate table-format ECC signing key) to " .. privkey_path .. " to use this program.")
end

local ecc = require "./ecc"
local t = ecc "ecc"

local thing, UUID_override = ...
local function fread(thing)
    local f = fs.open(thing, "r")
    local text = f.readAll()
    f.close()
    return text
end

local function hexize(key)
    local out = ""
    for _, v in pairs(key) do
        out = out .. string.format("%.2x", v)
    end
    return out
end

local function unhexize(key)
    local out = {}
    for i = 1, #key, 2 do
        local pair = key:sub(i, i + 1)
        table.insert(out, tonumber(pair, 16))
    end
    return out
end

local function fwrite(fname, text)
    local f = fs.open(fname, "w")
    f.write(text)
    f.close()
end

local pkey = unhexize(fread(privkey_path))

local _, side = os.pullEvent "disk"
local mp = disk.getMountPath(side)
local path = fs.combine(mp, "startup")
local sig_path = fs.combine(mp, "signature")

local UUID_path = fs.combine(mp, "UUID")
local UUID = ""

if UUID_override then UUID = UUID_override
else
	if fs.exists(UUID_path) then UUID = fread(UUID_path)
	else
		for i = 1, 10 do
			UUID = UUID .. string.char(math.random(97, 122))
		end
	end
end

print("UUID:", UUID)

disk.setLabel(side, thing)
local text = fread(thing):gsub("@UUID@", UUID)

fwrite(path, text)
print "Written data."
fwrite(sig_path, hexize(t.sign(
    pkey,
    text
)))
fwrite(UUID_path, tostring(UUID))
print "Written signature."
print("Disk ID:", disk.getID(side))