mirror of
https://github.com/luxfi/magnetar.git
synced 2026-09-24 00:25:23 +00:00
feat: KAT generator + deterministic vectors (ref/go/cmd/genkat)
cmd/genkat: deterministic KAT (Known Answer Test) generator. Emits five JSON vector files under vectors/: - keygen.json: 9 vectors (3 seeds x 3 modes) - sign.json: 9 vectors (3 seeds x 3 modes; deterministic SignDeterministic on random seed-derived keys) - verify.json: 6 vectors (1 positive + 1 negative per mode x 3 modes; negative case flips a byte mid-signature) - threshold-sign.json: 3 vectors (n=3/t=2, n=5/t=3, n=7/t=4 over ModeM192s only — the recommended mode is the only one exercised in v0.1 threshold path) - dkg.json: 3 vectors (same configurations as threshold-sign) Determinism gate: re-running genkat on a clean checkout MUST produce byte-identical output. Validated by diff -r against a fresh second run; KAT replay tests in kat_test.go further check that the package reproduces every entry verbatim. Total vectors size: ~935 KB (sign.json dominates at ~494 KB because SLH-DSA-SHAKE-192s signatures are 16224 bytes each).
This commit is contained in:
@@ -0,0 +1,355 @@
|
||||
// Copyright (C) 2025-2026, Lux Industries Inc. All rights reserved.
|
||||
// See the file LICENSE for licensing terms.
|
||||
|
||||
// genkat is the canonical KAT (Known Answer Test) generator for
|
||||
// Magnetar. It produces the JSON vector files committed under
|
||||
// vectors/ — keygen, sign, verify, threshold-sign, dkg.
|
||||
//
|
||||
// Re-running genkat on a clean checkout MUST produce byte-identical
|
||||
// output. Drift is a CI failure. The deterministic-fixture gate
|
||||
// is validated by re-running this binary and diffing against
|
||||
// committed JSON.
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
pm "github.com/luxfi/magnetar/ref/go/pkg/magnetar"
|
||||
)
|
||||
|
||||
// masterSeedHex is the head-of-file 48-byte seed from which every
|
||||
// KAT in the file is reproducible. Re-running genkat with the same
|
||||
// masterSeed gives bit-identical output.
|
||||
const masterSeedHex = "f1a5c98e2d40e9b7a3f87216d4ca09fbb6e51d75c7e3a920" +
|
||||
"4f3c1aab83de2f08e1d5b4a1c8f6b9e6743a298e7062a5c4"
|
||||
|
||||
type KeygenKAT struct {
|
||||
Mode string `json:"mode"`
|
||||
Seed string `json:"seed"`
|
||||
PublicKey string `json:"public_key"`
|
||||
PrivateKey string `json:"private_key"`
|
||||
}
|
||||
|
||||
type SignKAT struct {
|
||||
Mode string `json:"mode"`
|
||||
Seed string `json:"seed"`
|
||||
Message string `json:"message"`
|
||||
Context string `json:"context"`
|
||||
Signature string `json:"signature"`
|
||||
}
|
||||
|
||||
type VerifyKAT struct {
|
||||
Mode string `json:"mode"`
|
||||
PublicKey string `json:"public_key"`
|
||||
Message string `json:"message"`
|
||||
Context string `json:"context"`
|
||||
Signature string `json:"signature"`
|
||||
Valid bool `json:"valid"`
|
||||
}
|
||||
|
||||
type ThresholdSignKAT struct {
|
||||
Mode string `json:"mode"`
|
||||
N int `json:"n"`
|
||||
T int `json:"t"`
|
||||
Message string `json:"message"`
|
||||
PublicKey string `json:"public_key"`
|
||||
Signature string `json:"signature"`
|
||||
Quorum []string `json:"quorum"`
|
||||
SessionID string `json:"session_id"`
|
||||
Attempt uint32 `json:"attempt"`
|
||||
}
|
||||
|
||||
type DKGKAT struct {
|
||||
Mode string `json:"mode"`
|
||||
N int `json:"n"`
|
||||
T int `json:"t"`
|
||||
Committee []string `json:"committee"`
|
||||
PublicKey string `json:"public_key"`
|
||||
TranscriptHash string `json:"transcript_hash"`
|
||||
Shares []string `json:"shares"` // per-party packed share (seed_size×2 bytes hex)
|
||||
}
|
||||
|
||||
// detReader is a deterministic byte stream from a seed via
|
||||
// SHA-256 chaining. Identical layout to Pulsar's genkat detReader.
|
||||
type detReader struct {
|
||||
seed []byte
|
||||
buf []byte
|
||||
off int
|
||||
}
|
||||
|
||||
func newDetReader(seed []byte) *detReader {
|
||||
return &detReader{seed: seed}
|
||||
}
|
||||
|
||||
func (r *detReader) Read(p []byte) (int, error) {
|
||||
for n := 0; n < len(p); {
|
||||
if r.off >= len(r.buf) {
|
||||
ctr := uint32(len(r.buf) / 32)
|
||||
r.buf = nil
|
||||
for i := 0; i < 128; i++ {
|
||||
h := sha256.New()
|
||||
h.Write(r.seed)
|
||||
h.Write([]byte{byte(ctr >> 24), byte(ctr >> 16), byte(ctr >> 8), byte(ctr)})
|
||||
r.buf = append(r.buf, h.Sum(nil)...)
|
||||
ctr++
|
||||
}
|
||||
r.off = 0
|
||||
}
|
||||
c := copy(p[n:], r.buf[r.off:])
|
||||
n += c
|
||||
r.off += c
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
outDir := flag.String("out", "vectors", "output directory for KAT JSON files")
|
||||
flag.Parse()
|
||||
|
||||
masterSeed, err := hex.DecodeString(masterSeedHex)
|
||||
if err != nil {
|
||||
fail(err)
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(*outDir, 0o755); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
|
||||
modes := []pm.Mode{pm.ModeM192s, pm.ModeM192f, pm.ModeM256s}
|
||||
|
||||
// ---- keygen ----
|
||||
keygenKATs := []KeygenKAT{}
|
||||
for _, mode := range modes {
|
||||
params := pm.MustParamsFor(mode)
|
||||
for i := 0; i < 3; i++ {
|
||||
seedReader := newDetReader(append(masterSeed, []byte{0x00, byte(mode), byte(i)}...))
|
||||
seed := make([]byte, params.SeedSize)
|
||||
_, _ = seedReader.Read(seed)
|
||||
sk, err := pm.KeyFromSeed(params, seed)
|
||||
if err != nil {
|
||||
fail(err)
|
||||
}
|
||||
keygenKATs = append(keygenKATs, KeygenKAT{
|
||||
Mode: mode.String(),
|
||||
Seed: hex.EncodeToString(seed),
|
||||
PublicKey: hex.EncodeToString(sk.Pub.Bytes),
|
||||
PrivateKey: hex.EncodeToString(sk.Bytes),
|
||||
})
|
||||
}
|
||||
}
|
||||
writeJSON(filepath.Join(*outDir, "keygen.json"), keygenKATs)
|
||||
|
||||
// ---- sign ----
|
||||
signKATs := []SignKAT{}
|
||||
for _, mode := range modes {
|
||||
params := pm.MustParamsFor(mode)
|
||||
for i := 0; i < 3; i++ {
|
||||
seedReader := newDetReader(append(masterSeed, []byte{0x10, byte(mode), byte(i)}...))
|
||||
seed := make([]byte, params.SeedSize)
|
||||
_, _ = seedReader.Read(seed)
|
||||
sk, _ := pm.KeyFromSeed(params, seed)
|
||||
msg := []byte(fmt.Sprintf("Magnetar KAT message %s #%d", mode.String(), i))
|
||||
sig, err := pm.Sign(params, sk, msg, nil, false, nil)
|
||||
if err != nil {
|
||||
fail(err)
|
||||
}
|
||||
signKATs = append(signKATs, SignKAT{
|
||||
Mode: mode.String(),
|
||||
Seed: hex.EncodeToString(seed),
|
||||
Message: hex.EncodeToString(msg),
|
||||
Context: "",
|
||||
Signature: hex.EncodeToString(sig.Bytes),
|
||||
})
|
||||
}
|
||||
}
|
||||
writeJSON(filepath.Join(*outDir, "sign.json"), signKATs)
|
||||
|
||||
// ---- verify ----
|
||||
verifyKATs := []VerifyKAT{}
|
||||
for _, mode := range modes {
|
||||
params := pm.MustParamsFor(mode)
|
||||
seedReader := newDetReader(append(masterSeed, []byte{0x20, byte(mode)}...))
|
||||
seed := make([]byte, params.SeedSize)
|
||||
_, _ = seedReader.Read(seed)
|
||||
sk, _ := pm.KeyFromSeed(params, seed)
|
||||
msg := []byte(fmt.Sprintf("Magnetar Verify KAT %s", mode.String()))
|
||||
sig, _ := pm.Sign(params, sk, msg, nil, false, nil)
|
||||
verifyKATs = append(verifyKATs, VerifyKAT{
|
||||
Mode: mode.String(),
|
||||
PublicKey: hex.EncodeToString(sk.Pub.Bytes),
|
||||
Message: hex.EncodeToString(msg),
|
||||
Context: "",
|
||||
Signature: hex.EncodeToString(sig.Bytes),
|
||||
Valid: true,
|
||||
})
|
||||
// Negative: flip a byte.
|
||||
badSig := make([]byte, len(sig.Bytes))
|
||||
copy(badSig, sig.Bytes)
|
||||
badSig[len(badSig)/2] ^= 0x01
|
||||
verifyKATs = append(verifyKATs, VerifyKAT{
|
||||
Mode: mode.String(),
|
||||
PublicKey: hex.EncodeToString(sk.Pub.Bytes),
|
||||
Message: hex.EncodeToString(msg),
|
||||
Context: "",
|
||||
Signature: hex.EncodeToString(badSig),
|
||||
Valid: false,
|
||||
})
|
||||
}
|
||||
writeJSON(filepath.Join(*outDir, "verify.json"), verifyKATs)
|
||||
|
||||
// ---- threshold-sign ---- (only ModeM192s for KAT brevity;
|
||||
// SHAKE-192s is the recommended mode and the only one
|
||||
// exercised under threshold in v0.1)
|
||||
thresholdKATs := []ThresholdSignKAT{}
|
||||
for _, mode := range []pm.Mode{pm.ModeM192s} {
|
||||
for _, tc := range []struct{ N, T int }{{3, 2}, {5, 3}, {7, 4}} {
|
||||
params := pm.MustParamsFor(mode)
|
||||
committee := makeKATCommittee(tc.N)
|
||||
pub, shares, _ := runKATDKG(params, committee, tc.T, mode, masterSeed)
|
||||
msg := []byte(fmt.Sprintf("Magnetar Threshold KAT %s n=%d t=%d", mode.String(), tc.N, tc.T))
|
||||
quorum := make([]pm.NodeID, tc.T)
|
||||
for i := 0; i < tc.T; i++ {
|
||||
quorum[i] = shares[i].NodeID
|
||||
}
|
||||
var sid [16]byte
|
||||
copy(sid[:], "kat-threshold01")
|
||||
attempt := uint32(1)
|
||||
signers := make([]*pm.ThresholdSigner, tc.T)
|
||||
for i := 0; i < tc.T; i++ {
|
||||
rng := newDetReader(append(masterSeed, []byte{0x30, byte(mode), byte(tc.T), byte(i)}...))
|
||||
signers[i], _ = pm.NewThresholdSigner(params, sid, attempt, quorum, shares[i], msg, rng)
|
||||
}
|
||||
r1 := make([]*pm.Round1Message, tc.T)
|
||||
for i, s := range signers {
|
||||
r1[i], _ = s.Round1()
|
||||
}
|
||||
r2 := make([]*pm.Round2Message, tc.T)
|
||||
for i, s := range signers {
|
||||
r2[i], _, _ = s.Round2(r1)
|
||||
}
|
||||
sig, err := pm.Combine(params, pub, msg, nil, false, sid, attempt, quorum, tc.T, r1, r2, shares)
|
||||
if err != nil {
|
||||
fail(fmt.Errorf("threshold combine n=%d t=%d: %w", tc.N, tc.T, err))
|
||||
}
|
||||
// Cross-check: verify under unmodified FIPS 205.
|
||||
if err := pm.Verify(params, pub, msg, sig); err != nil {
|
||||
fail(fmt.Errorf("threshold KAT FIPS 205 Verify failed: %w", err))
|
||||
}
|
||||
quorumHex := make([]string, len(quorum))
|
||||
for i, q := range quorum {
|
||||
quorumHex[i] = hex.EncodeToString(q[:])
|
||||
}
|
||||
thresholdKATs = append(thresholdKATs, ThresholdSignKAT{
|
||||
Mode: mode.String(),
|
||||
N: tc.N,
|
||||
T: tc.T,
|
||||
Message: hex.EncodeToString(msg),
|
||||
PublicKey: hex.EncodeToString(pub.Bytes),
|
||||
Signature: hex.EncodeToString(sig.Bytes),
|
||||
Quorum: quorumHex,
|
||||
SessionID: hex.EncodeToString(sid[:]),
|
||||
Attempt: attempt,
|
||||
})
|
||||
}
|
||||
}
|
||||
writeJSON(filepath.Join(*outDir, "threshold-sign.json"), thresholdKATs)
|
||||
|
||||
// ---- dkg ----
|
||||
dkgKATs := []DKGKAT{}
|
||||
for _, mode := range []pm.Mode{pm.ModeM192s} {
|
||||
for _, tc := range []struct{ N, T int }{{3, 2}, {5, 3}, {7, 4}} {
|
||||
params := pm.MustParamsFor(mode)
|
||||
committee := makeKATCommittee(tc.N)
|
||||
pub, shares, transcript := runKATDKG(params, committee, tc.T, mode, masterSeed)
|
||||
committeeHex := make([]string, tc.N)
|
||||
for i, c := range committee {
|
||||
committeeHex[i] = hex.EncodeToString(c[:])
|
||||
}
|
||||
shareHex := make([]string, tc.N)
|
||||
for i, s := range shares {
|
||||
shareHex[i] = hex.EncodeToString(s.Share)
|
||||
}
|
||||
dkgKATs = append(dkgKATs, DKGKAT{
|
||||
Mode: mode.String(),
|
||||
N: tc.N,
|
||||
T: tc.T,
|
||||
Committee: committeeHex,
|
||||
PublicKey: hex.EncodeToString(pub.Bytes),
|
||||
TranscriptHash: hex.EncodeToString(transcript[:]),
|
||||
Shares: shareHex,
|
||||
})
|
||||
}
|
||||
}
|
||||
writeJSON(filepath.Join(*outDir, "dkg.json"), dkgKATs)
|
||||
|
||||
fmt.Println("KAT vectors written to", *outDir)
|
||||
}
|
||||
|
||||
func makeKATCommittee(n int) []pm.NodeID {
|
||||
out := make([]pm.NodeID, n)
|
||||
for i := 0; i < n; i++ {
|
||||
out[i][0] = byte(i + 1)
|
||||
copy(out[i][1:], []byte("MAGNETAR-KAT"))
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// runKATDKG runs a deterministic DKG ceremony for KAT generation.
|
||||
func runKATDKG(params *pm.Params, committee []pm.NodeID, threshold int, mode pm.Mode, masterSeed []byte) (*pm.PublicKey, []*pm.KeyShare, [48]byte) {
|
||||
n := len(committee)
|
||||
sessions := make([]*pm.DKGSession, n)
|
||||
for i := range sessions {
|
||||
seedTag := append([]byte("MAGNETAR-DKG-KAT-V1"), []byte{byte(mode), byte(n), byte(threshold), byte(i)}...)
|
||||
rng := newDetReader(append(masterSeed, seedTag...))
|
||||
s, err := pm.NewDKGSession(params, committee, threshold, committee[i], rng)
|
||||
if err != nil {
|
||||
fail(fmt.Errorf("NewDKGSession[%d]: %w", i, err))
|
||||
}
|
||||
sessions[i] = s
|
||||
}
|
||||
r1 := make([]*pm.DKGRound1Msg, n)
|
||||
for i, s := range sessions {
|
||||
r1[i], _ = s.Round1()
|
||||
}
|
||||
r2 := make([]*pm.DKGRound2Msg, n)
|
||||
for i, s := range sessions {
|
||||
r2[i], _ = s.Round2(r1)
|
||||
}
|
||||
outs := make([]*pm.DKGOutput, n)
|
||||
for i, s := range sessions {
|
||||
o, err := s.Round3(r2)
|
||||
if err != nil {
|
||||
fail(fmt.Errorf("Round3[%d]: %w", i, err))
|
||||
}
|
||||
outs[i] = o
|
||||
}
|
||||
shares := make([]*pm.KeyShare, n)
|
||||
for i, o := range outs {
|
||||
shares[i] = o.SecretShare
|
||||
}
|
||||
return outs[0].GroupPubkey, shares, outs[0].TranscriptHash
|
||||
}
|
||||
|
||||
func writeJSON(path string, v any) {
|
||||
f, err := os.Create(path)
|
||||
if err != nil {
|
||||
fail(err)
|
||||
}
|
||||
defer f.Close()
|
||||
enc := json.NewEncoder(f)
|
||||
enc.SetIndent("", " ")
|
||||
if err := enc.Encode(v); err != nil {
|
||||
fail(err)
|
||||
}
|
||||
}
|
||||
|
||||
func fail(err error) {
|
||||
fmt.Fprintln(os.Stderr, "genkat: error:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
[
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192s",
|
||||
"n": 3,
|
||||
"t": 2,
|
||||
"committee": [
|
||||
"014d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"024d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"034d41474e455441522d4b415400000000000000000000000000000000000000"
|
||||
],
|
||||
"public_key": "00e9fbf013ca7545571967b0049ab6da32dc5cae04a17c37043193ce082ded911d6a230696611ab0f08f7b407dc087ee",
|
||||
"transcript_hash": "bf947e530b0751eec72892228b3f3a7cddc82ef88b4c28ce7a928b3a3a0b7d7a3342a85353ccc68562902b1003ef565d",
|
||||
"shares": [
|
||||
"007300fe00e20020007e00b200af0022004800f00090001b00520088009d008d00d600eb001e0048001600ea00a4004400e900ac007b000b009800c800ac010000fd006500920068001b006e00990032000d002800d900ec00d400d600d6000600fd0022004500d2008600a400a900920078002600be00a10019000500b600c7002200db000600000033006c00bb008700ef0079007e00720047003200c100eb00ff003600e7003d007400900009000b0094004500ec006d00ba002100d900b6",
|
||||
"007000f5003200df0011001a008500fd00ba0052004b00e70070009700780017003b007d00f90080006c000a005e0041008f008d006b0091004500eb00f7006e009e00e500ff0071006b00a0008900b800ec004f00a200aa00990075001a008d0071003700010056003d00e80035005e001a00f700230011000e001800b7002d00b600670047003f007b00d4000400f70026004b00be009100bb00810063003f00c900b700bf00c6006c00600038009f00210042008f01000018000e009a00cf",
|
||||
"006d00ec0083009d00a50083005b00d7002b00b5000600b2008e00a6005300a200a1000f00d300b800c2002b0018003e0035006e005b001600f3000d004100dd003f0064006b007a00bb00d20079003d00ca0076006b0068005e0014005f001300e6004c00be00db00f5002b00c2002a00bd00c7008900820003002b00b80094004900f40088007e00c3003b004e0066005e001d00fe00b0002e00d000050094009300370097004e006400300067003200af003f00320092007700fc005b00e8"
|
||||
]
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192s",
|
||||
"n": 5,
|
||||
"t": 3,
|
||||
"committee": [
|
||||
"014d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"024d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"034d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"044d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"054d41474e455441522d4b415400000000000000000000000000000000000000"
|
||||
],
|
||||
"public_key": "25347c8546911a2ee05143a1402c0c2d1d78b50a646c063f9beae0e33c87070c994a05f98e026e465405be1c9e3663dc",
|
||||
"transcript_hash": "ad4c918372b3f86fb2285e60d5cf4a50a8843950cdbcdc05a015f5ec89619076f4feccf571f13b7ebbd0ab86ac59b718",
|
||||
"shares": [
|
||||
"00ff00a8003700ee002f0090002d0093002b0014000f0069007e001e00d000f00079006f000e00cc002a00eb00940100008a006600e7000d00e1001300bb004a00f6009d00d2006d00180037009700fc0099003d00e2003a00d100d700e0008500e4009700ec00770038002000d5008500270070005f009000bb00e900590064000a0007001500b600bd00b6008c00a4008900b20060000e00df003d00460051006c000f00d800df000900810095002900b1009c002a001a007e000f006800e3",
|
||||
"00850070008a005800740018004c0072007700720063006200e5008200ee0049009300de00b4007b00c100da006000d600c700c000a20033000900c80086005c00010001003d00ec00b50018001200990017007300ab002400d20060003f00dd00dc00bd0049000b00480044006300ce00cb008200b900af00ce0067001600c5003700d7001d00d9007100b900b0005a009a00c100c800a30077007500120070005f009d009b00ff0070003200540095002900e2003f00a300ed00d300330067",
|
||||
"0037006400bd00f400e6006f0016008f000e00b300db0065004b006e00db00b800d3004f006000ec0000009b0071003e004d0017000800d700bf004a0075007c008e0047000900440011004d006f00b40039005e0053000b00ad0010005d00dc006000720087003a0081005200d2001d00b3009200ca00bb0051005e0041001a006a002800e6009600fc00ca00e6005000dc002b0012009b00c100ba00110076009200f300ff00e800d9008e00af002400bc00db0067001400ce00ea0082006e",
|
||||
"0015008400d000c000840094008c00ea00f200d70076007200b200e30097003b003800c40013001d00ea002e00c70039001d006d001a00f80000009b008800aa009b006e00360077002e00d600ad004c00ff00ff00db00f0006200e800390082007100b700a5000300e3004a0020007400e000a0009200b4004500ce00da006500a300fd006e00ee005c00e9002d0086004e00f2004000f700bc000b00430063000400100002009a0043009400a500d80068008700a2006f00210054005400f8",
|
||||
"001f00d000c300bd004f008700ad0082002000de00350089001800e0002200d400c4003b00ce0010007c0094006100c7003700c100d8009600cf00ba00bf00e60028007600c40084000b00b200cc006200670054004100d100f200e600d400d0000e008b00a30067006d002c004f00d2005100ac0011009a00aa00b600e000a500e2005300b700e000930015008700fc00f20013005100b60068006a00a8003700b700f700a7001500b00044003600af002e00e700f000b300e8001200aa0003"
|
||||
]
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192s",
|
||||
"n": 7,
|
||||
"t": 4,
|
||||
"committee": [
|
||||
"014d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"024d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"034d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"044d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"054d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"064d41474e455441522d4b415400000000000000000000000000000000000000",
|
||||
"074d41474e455441522d4b415400000000000000000000000000000000000000"
|
||||
],
|
||||
"public_key": "845e0e4bbd6ada79af6d03ba28e47c65b7b6908e2f6d254db47eb67bca36cfd1e04bcec15f0abb676e960ff62b90ff77",
|
||||
"transcript_hash": "f23441542218ce4a03231c51c0b26aad897b6eaf91a36841fe08923411dc0cb2363b4e4382797832e96054b81ffff342",
|
||||
"shares": [
|
||||
"00300047003100f200520056005f008000ad00ca00a1003600d100ad0091007600aa000a00ac00ce00c00068001600160079008400b2004100410011004800f5007c0010006a00e200a2001a01000037008e000900fa0082005c00be0083009b0073002d0006008000280067008200c4002b0055003c0067000300c8000900fc00bf00a500e500e8004c002a0022009000b300dd00a0009800d6004400d90018007a007e00f300f4003e00bd002200c600f000d500fa000e005c001a00a60009",
|
||||
"0064009700e800d500e9001f00d600fb0079006d0024004c00a2006400c30041001f0038005600e1001f000700400083003f00c900a400cc009a004c00fb007600b80069006d005700ba00c5008a009100fb00cf00e9007f0031003f00ff008000030090008d000200d8002b0050004900ee00ed00f000be0051004d007f00eb00c2007f000d0099008100ff00ab006c00a60020001600a100a80048003600ea00fe007100ad0005001b0009009100f5002300ba00000085003300ea00790050",
|
||||
"0086008b005500e7006000fe00cd005d00f8001a0088003200e400e300e700a5005a006800a5008d0067005500a7005f0058005500e500bf00bf00ce007c00a9000e00ae00b200da00c1000400c900a900ed000c002a00d2000700d900f7001d0066004d0067009a00bb0030005c000200d50071006000b70030007300f7007400240088008c00ce00020041009300a300e200b9002300070004008c001200f1009100ab00da0012002400fb003500ae006f000700a400ea0020004a000d0069",
|
||||
"001e00ed00b100e000bf008f00ae0090006800fd005500b7003400810087006e0089006b00e60036001100a600fc001e0062006e009f001a0096004c00860032008400f0008c00d800e80041004a007900b10043002f00550053006c004a00b2003a002d0000006c00ed00c700ea006e001e0066009300e90014006300a3002d00cc0078000e00600099008e00b600cf00de005500c60048004a007400560002007500fa009f00260087000d0067004a003b006c009b004200b300c1005a0044",
|
||||
"00b6008500310078000a007200e3007b000a003e001500a800320098002e006a00db0012006600400099004e00f0003400fc005800fe00df0005007e00d200b8001c003f004f00c0005f00e3009d00fc009400f4006800e5008900dc00d9007c001f00f900c5009f0088003f003c000a0008004f008d00ea0071004700b700ac009d00070043002a000c008000ef008a001100a500fd00e000d8006500eb00f500eb002b0022004d007100c0007e002200f10096009d0095007a00d2005600d2",
|
||||
"00d5001d000d00680049004500d50006001e000a005200d4007c008000670066007e002f0074000e007800a30034001400c30058002b000b00f40019001800df00dc00ae004f000000580050004f002a00e3009e0045005b001d0009008100bb00b50077001f005800a800eb0098005600d100b00053005000ba004900650085007d00ef00d90006002500b30018006f00f5005700c7004a000b00c400b9009c0032000e008a00930010008f00d2008f00f80033006100e80005000100f90001",
|
||||
"0003007f007c0068008100a700ee001a00e4008c0095000800b0009200bc002f00a20093005d0004002900f9007b0032005600b3005300a1004600d50013004c00c6004c00e00008000300f200f0010000ea00c300370094008500d8002200ad009a0071007c00be00670019004000d000b5000b00eb00b30062009300e1004e005100e6007d00cf00ac00c2000e001800ff001b00230004004400f500aa00ce008d007100fc0003009300f900ba00e900b900f3009f004000e500d5003800c4"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192s",
|
||||
"seed": "fa377e9fdd5cb8928daba8f98d3e3002e2cec2c888e922c3a33fe4695e8ce5c735ecfb78a48484eaffbca9a93dce69d6dff0b4cdc47365b38eccbac90a27d5359d159af2a443b5d23d3cc719488998af7668d85d189f00db1cec00e7aeae3e18",
|
||||
"public_key": "cb779d68171a23690361e6418fdc7cc51047da8ffe89e2e221445faa8c122221b90579f1522163d9c2cfdf4475985e1d",
|
||||
"private_key": "3e2dcee025188be441b6e623e04f1d859bae04dcca4c588921e2cfc03ddd2c0d07a9578b4dc7c122cd94698092836c9ecb779d68171a23690361e6418fdc7cc51047da8ffe89e2e221445faa8c122221b90579f1522163d9c2cfdf4475985e1d"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192s",
|
||||
"seed": "4a049a99a72d637cabaea8e96802658e07ca981b8e5b249529b1c5b84ac89152e83efb9a44dc03e248f5a153bdb474b4769bacda458aaeb04b295b37dd71a40512b9f878a5a2230bfcc517a023bb8fc45166e3540f5dc2fe4e3446e1da77303f",
|
||||
"public_key": "6873f329bc96f99ab041d80b95b8590358d118dc939d46d736746a54519d00df7658fff852e335f282d90ab7910d1e8f",
|
||||
"private_key": "da27f8af9f81f1f741e183057b130a98716337bbfbfee718f0c038ca7e90e4088addacb162dd05c378acdc8fa6b08ca36873f329bc96f99ab041d80b95b8590358d118dc939d46d736746a54519d00df7658fff852e335f282d90ab7910d1e8f"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192s",
|
||||
"seed": "bda1ee8777c3c0746d6e6d70fb8dc5ad3db98caa1870de93488ddf70195d8ff369c8c9eb008c559425809f214f99f843348f44bbbe1efed865e8dcc8fb294af9534ad37d77163d7f63cee6e2a7cb514ce34497bd7324ca53ee5425a0fe95f31c",
|
||||
"public_key": "81c86af5a893a71b6ae1c00b00bd02c622b1c005d5b5e7d6afa867bc2b44daa9a723dd8f83263c9765c5af3101a1bf7d",
|
||||
"private_key": "2aa92516adc5743bc715684cee063b5ea9eedc9c7f9a3d6abab1350236b48ffc7ff1dbdd6dc14bfe76abc459fe34392881c86af5a893a71b6ae1c00b00bd02c622b1c005d5b5e7d6afa867bc2b44daa9a723dd8f83263c9765c5af3101a1bf7d"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192f",
|
||||
"seed": "021aab0228638c2eac9a71a75d4508aaab0f52ae07674b587ccf6c2b109d4a813f7af1da0576257755665dee5044bc84d352bf875768d92cd0977b04351fd4ad5113f334939687cf513ccabe3ba3b07ac4b370189c5773036c2903bc841f0178",
|
||||
"public_key": "1ab561fa0eb76ae83b3302e67cebf8b66977a92936c8616a62da18c71da3634fcd5ca3896f1a7788ed6d72caa2c34744",
|
||||
"private_key": "f59ef9b28d1a71708108fbde95dc1e1f648b011c54131d9471773797293222db0cb2c829d1d3d472f364ef5e05b6a82c1ab561fa0eb76ae83b3302e67cebf8b66977a92936c8616a62da18c71da3634fcd5ca3896f1a7788ed6d72caa2c34744"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192f",
|
||||
"seed": "55906aa4c58ae4d15eef71979480f768eb496dc354dfe8b3b90061a7a6adea508b116cceebd5b5488ab11c8516997f0e30207b81c2e694051e518a44e52c9e7e48a798e94a3a9410451d8a6f2c72c8a9b35e5e51398451cd52d1c9634f19894b",
|
||||
"public_key": "9b542417ae6634b52805a1f97e2fea51efb436d1e75852d7d865b3d9720afb3405002bedc19310fd7ca984110c797ab4",
|
||||
"private_key": "cbbcee14bfd2495e0f211c9a62bcc1ac23fb102f76269a9cb4d38c55e296b44992675597badd65b606d95158da0838889b542417ae6634b52805a1f97e2fea51efb436d1e75852d7d865b3d9720afb3405002bedc19310fd7ca984110c797ab4"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-192f",
|
||||
"seed": "785a01dd825b03f33da7ca6e3b42ed3419b334e855456604535a97e95c46fb27573889b525ed324fa2640be3eecbabea1e84775bab55b0bd0d88f04772f5a72a8fde6726feb6c3b4429f1bab8c8e9847a5836748244cefaca0240062e0ab685a",
|
||||
"public_key": "6e9afb9f547c9fa682191bacaa5026cc1fd831423183a990b62531662b5623114c1ce0db09f7a79970e4cd50055113c0",
|
||||
"private_key": "bcf0637a8ad57daa3e9e25f11ea8892d33313a469e4b8a3d95e3cd1718ec3b750b4cda4986ad7997059a02de057829346e9afb9f547c9fa682191bacaa5026cc1fd831423183a990b62531662b5623114c1ce0db09f7a79970e4cd50055113c0"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-256s",
|
||||
"seed": "532073e3d25aaf7f3dbcdb63ce3827a61929ec3af6ce9c748c91d8a7d8334f87c8e637853a5079e5beb8c4d086f5b7f68b849aa54d92372f4c2c17d904e12c7a1709fa6453a322c615c1a583cd0e485003cf58dea5b0fbaf1571df1275e05060190978f7b33658645d04455fc02951af4c0d1138c2642cab091decd57353bd41",
|
||||
"public_key": "9e65d016d460469bf7fc1ec58732e09a1d3cc70d7155328c85a97d3e40d44cd6458ab7fc7040b4895a81b4b5d10f62185aa1c212c7546292d7649d6dbccccf6b",
|
||||
"private_key": "6b220055ba4c22efcfee60958890a23ddb1312d88db931e8186445295d0f6673fd5565d10259831e13df8e245a745b053f72c986ffcf05df4b8da61d8510301c9e65d016d460469bf7fc1ec58732e09a1d3cc70d7155328c85a97d3e40d44cd6458ab7fc7040b4895a81b4b5d10f62185aa1c212c7546292d7649d6dbccccf6b"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-256s",
|
||||
"seed": "2d9df1020781980dce910c5a9fc270044ee74a24ec468019ca3f603f4d04d738a7ee49f44dfc6f756c128fa7a1b28ad2142496b73298c3c48a413dbcb3906b34616eca880dd37d45162f405ba565ab72cc67c183db7d3e224947f53defd177ee9a7dc5c62a20619fa4b72518b0e51cea5a58a2db797b80527e8fe34b2ca5ef29",
|
||||
"public_key": "e0e2e60711d739dd086c2465537d42abb745b3eeeac203cf6c24bc0d47597523afcb717a548b762d7c7aff32c1cb79b07fba34ff12988f1a85727dd842b22c9d",
|
||||
"private_key": "ff81540a0b7712a36815f87167e517ca0d6125a1ef05c02aa20adff267c52b043a58242e14803db6dc15d46b9de8419837586ec9a7c581148b0b62abec075b6de0e2e60711d739dd086c2465537d42abb745b3eeeac203cf6c24bc0d47597523afcb717a548b762d7c7aff32c1cb79b07fba34ff12988f1a85727dd842b22c9d"
|
||||
},
|
||||
{
|
||||
"mode": "Magnetar-SHAKE-256s",
|
||||
"seed": "3ddf799a6d939726be03e7a4f9854480eb1f1691697ccb1f0b86cd17eea24f5beff4493b75e26cb2843090f6136c159dbafe8a9b7d271354f6f68214d3ee0f8e0d44e4e7cd15c78a097d310bcef5f0a1e46d7e34b8bf0b97093465078e8d24b8b2f2f91a357f8388f18cdc0a50e74f7a75eeea33bc6ba13f0f1dc3253e694f7b",
|
||||
"public_key": "f488b3ed850db5a05209e2123f2408dac4c48aa6936b3b7f01fadb8e1c0d6409d452ffbf76c88a6405ad1f5ff2e3f0e64828456189322eb26aee91de18836ba9",
|
||||
"private_key": "ecbadcfd58962d84f2c727df7919a597c18134cb8ae29d5427ee68db4e6ea56239e2ac989ead686451688e8e3bb23b74bbda1ca48f9025e497f5d8041e565a65f488b3ed850db5a05209e2123f2408dac4c48aa6936b3b7f01fadb8e1c0d6409d452ffbf76c88a6405ad1f5ff2e3f0e64828456189322eb26aee91de18836ba9"
|
||||
}
|
||||
]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user