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:
2026-05-19 01:25:10 -07:00
parent c47faff81d
commit 2bf7763e4b
6 changed files with 638 additions and 0 deletions
+355
View File
@@ -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)
}
+65
View File
@@ -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"
]
}
]
+56
View File
@@ -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"
}
]
+65
View File
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