// ab_s1_check.go -- independent check of Afterberry profile AB-S1 (manual revision 2.0).
//
// Rebuilds the known-answer vector of afterberry_ref.py with a different implementation
// in a different language: klauspost/reedsolomon, which follows Backblaze's construction.
//
//   go mod init ab_s1_check && go get github.com/klauspost/reedsolomon golang.org/x/crypto/sha3
//   go run ab_s1_check.go
package main

import (
	"crypto/sha256"
	"fmt"
	"os"

	"github.com/klauspost/reedsolomon"
	"golang.org/x/crypto/sha3"
)

const expected = "ee0df4b6b0e99c05ef38cf8a07af4ba8393898b1b83c6d91766ba14e4dcea324"

func main() {
	const k, n, record = 60, 88, 80
	vector := make([]byte, 7777)
	sha3.ShakeSum256(vector, []byte("afterberry/AB-S1/vector"))

	records := (len(vector) + record - 1) / record
	length := (records + k - 1) / k * record // every data shard is a whole number of records
	padded := make([]byte, length*k)
	copy(padded, vector)

	shards := make([][]byte, n)
	for i := 0; i < k; i++ {
		shards[i] = padded[i*length : (i+1)*length]
	}
	for i := k; i < n; i++ {
		shards[i] = make([]byte, length)
	}
	enc, err := reedsolomon.New(k, n-k)
	if err != nil {
		panic(err)
	}
	if err := enc.Encode(shards); err != nil {
		panic(err)
	}
	h := sha256.New()
	for _, s := range shards {
		h.Write(s)
	}
	got := fmt.Sprintf("%x", h.Sum(nil))
	fmt.Println(got)
	if got != expected {
		fmt.Println("MISMATCH")
		os.Exit(1)
	}
	fmt.Println("AB-S1 vector agrees with klauspost/reedsolomon")
}
