diff --git a/packages/wasm-crypto/src/lib.rs b/packages/wasm-crypto/src/lib.rs index d5eb7d8..c9ab33c 100644 --- a/packages/wasm-crypto/src/lib.rs +++ b/packages/wasm-crypto/src/lib.rs @@ -22,3 +22,6 @@ pub mod sr25519; #[path = "rs/vrf.rs"] pub mod vrf; + +#[path = "rs/kat.rs"] +pub mod kat; diff --git a/packages/wasm-crypto/src/rs/kat.rs b/packages/wasm-crypto/src/rs/kat.rs new file mode 100644 index 0000000..b107f2f --- /dev/null +++ b/packages/wasm-crypto/src/rs/kat.rs @@ -0,0 +1,221 @@ +// Copyright 2019-2025 @pezkuwi/wasm-crypto authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +//! Known-answer vectors for every exported function. +//! +//! `kat.txt` was produced by an earlier build and is checked in. Any change to +//! the crypto crates must leave every deterministic output byte-equal, and the +//! randomised signatures (sr25519, VRF proofs) recorded there must still +//! verify. Regenerate only on purpose: +//! +//! KAT_WRITE=src/rs/kat.txt cargo test --release kat_ -- --nocapture + +#[cfg(test)] +pub mod tests { + use crate::bip39::*; + use crate::ed25519::*; + use crate::hashing::*; + use crate::secp256k1::*; + use crate::sr25519::*; + use crate::vrf::*; + + const VECTORS: &str = include_str!("kat.txt"); + + const PHRASES: [&str; 3] = [ + "bottom drive obey lake curtain smoke basket hold race lonely fit walk", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + ]; + + fn to_hex(data: &[u8]) -> String { + data.iter().map(|b| format!("{:02x}", b)).collect() + } + + fn from_hex(s: &str) -> Vec { + (0..s.len()).step_by(2).map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap()).collect() + } + + fn pattern(len: usize, mul: usize) -> Vec { + (0..len).map(|i| ((i * mul + 7) % 251) as u8).collect() + } + + fn datas() -> Vec> { + vec![vec![], b"abc".to_vec(), pattern(1000, 31)] + } + + fn seeds() -> Vec> { + vec![vec![0u8; 32], pattern(32, 1), pattern(32, 97), b"12345678901234567890123456789012".to_vec()] + } + + fn chain_codes() -> Vec> { + // "Alice" as a SCALE-encoded string, zero padded, as util-crypto builds it + let mut alice = vec![0u8; 32]; + + alice[0] = 5 << 2; + alice[1..6].copy_from_slice(b"Alice"); + + vec![alice, pattern(32, 13)] + } + + fn messages() -> Vec> { + vec![vec![], b"this is a message".to_vec(), pattern(300, 7)] + } + + /// Every deterministic output, as `name hex` lines. + fn deterministic() -> Vec<(String, Vec)> { + let mut out: Vec<(String, Vec)> = Vec::new(); + + for (d, data) in datas().iter().enumerate() { + for size in [32u32, 64] { + out.push((format!("blake2b/{}/{}", d, size), ext_blake2b(data, &[], size))); + out.push((format!("blake2b-key/{}/{}", d, size), ext_blake2b(data, b"key", size))); + } + + out.push((format!("keccak256/{}", d), ext_keccak256(data))); + out.push((format!("keccak512/{}", d), ext_keccak512(data))); + out.push((format!("sha256/{}", d), ext_sha256(data))); + out.push((format!("sha512/{}", d), ext_sha512(data))); + out.push((format!("hmac256/{}", d), ext_hmac_sha256(b"key", data))); + out.push((format!("hmac512/{}", d), ext_hmac_sha512(b"key", data))); + + for rounds in [1u32, 2, 4] { + out.push((format!("twox/{}/{}", d, rounds), ext_twox(data, rounds))); + } + + for rounds in [1u32, 2048] { + out.push((format!("pbkdf2/{}/{}", d, rounds), ext_pbkdf2(data, b"salt", rounds))); + } + + out.push((format!("scrypt/{}", d), ext_scrypt(data, b"salt", 10, 8, 1))); + } + + for (p, phrase) in PHRASES.iter().enumerate() { + out.push((format!("bip39-valid/{}", p), vec![ext_bip39_validate(phrase) as u8])); + out.push((format!("bip39-entropy/{}", p), ext_bip39_to_entropy(phrase))); + + for (w, password) in ["", "password"].iter().enumerate() { + out.push((format!("bip39-mini/{}/{}", p, w), ext_bip39_to_mini_secret(phrase, password))); + out.push((format!("bip39-seed/{}/{}", p, w), ext_bip39_to_seed(phrase, password))); + } + } + + out.push(("bip39-valid/bad-checksum".into(), vec![ext_bip39_validate(&PHRASES[1].replace("about", "abandon")) as u8])); + + let pairs: Vec> = seeds().iter().map(|s| ext_sr_from_seed(s)).collect(); + + for (s, pair) in pairs.iter().enumerate() { + out.push((format!("sr-from-seed/{}", s), pair.clone())); + + for (c, cc) in chain_codes().iter().enumerate() { + let soft = ext_sr_derive_keypair_soft(pair, cc); + + out.push((format!("sr-derive-hard/{}/{}", s, c), ext_sr_derive_keypair_hard(pair, cc))); + // schnorrkel draws the nonce half of a soft-derived secret at random + out.push((format!("sr-derive-soft/{}/{}", s, c), [&soft[..32], &soft[64..]].concat())); + out.push((format!("sr-derive-public-soft/{}/{}", s, c), ext_sr_derive_public_soft(&pair[64..], cc))); + + // the public derivation must land on the public half of the soft pair + assert_eq!(ext_sr_derive_public_soft(&pair[64..], cc), soft[64..].to_vec()); + } + + for (o, other) in pairs.iter().enumerate() { + out.push((format!("sr-agree/{}/{}", s, o), ext_sr_agree(&other[64..], &pair[..64]))); + } + + for (m, msg) in messages().iter().enumerate() { + // the VRF output (not the proof) is a function of key and input only + out.push((format!("vrf-output/{}/{}", s, m), ext_vrf_sign(&pair[..64], b"ctx", msg, b"extra")[..32].to_vec())); + } + } + + for (s, seed) in seeds().iter().enumerate() { + let ed = ext_ed_from_seed(seed); + + out.push((format!("ed-from-seed/{}", s), ed.clone())); + + for (m, msg) in messages().iter().enumerate() { + out.push((format!("ed-sign/{}/{}", s, m), ext_ed_sign(&ed[32..], &ed[..32], msg))); + } + } + + // a zero scalar is not a secp256k1 secret key + for (s, seed) in seeds().iter().enumerate().skip(1) { + let secp = ext_secp_from_seed(seed); + + out.push((format!("secp-from-seed/{}", s), secp.clone())); + out.push((format!("secp-expand/{}", s), ext_secp_pub_expand(&secp[32..]))); + out.push((format!("secp-compress/{}", s), ext_secp_pub_compress(&ext_secp_pub_expand(&secp[32..])))); + + for (m, msg) in messages().iter().enumerate() { + let hash = ext_keccak256(msg); + let sig = ext_secp_sign(&hash, &secp[..32]); + + out.push((format!("secp-sign/{}/{}", s, m), sig.clone())); + out.push((format!("secp-recover/{}/{}", s, m), ext_secp_recover(&hash, &sig[..64], sig[64] as i32))); + } + } + + out + } + + /// Randomised signatures: `kind pubkey msg sig` lines that any later build must verify. + fn randomised() -> Vec { + let mut out = Vec::new(); + + for seed in seeds().iter() { + let pair = ext_sr_from_seed(seed); + + for msg in messages().iter() { + out.push(format!("sr-sig {} {} {}", to_hex(&pair[64..]), to_hex(msg), to_hex(&ext_sr_sign(&pair[64..], &pair[..64], msg)))); + out.push(format!("vrf-sig {} {} {}", to_hex(&pair[64..]), to_hex(msg), to_hex(&ext_vrf_sign(&pair[..64], b"ctx", msg, b"extra")))); + } + } + + out + } + + #[test] + fn kat_vectors() { + if let Ok(path) = std::env::var("KAT_WRITE") { + let mut lines: Vec = deterministic().iter().map(|(n, v)| format!("{} {}", n, to_hex(v))).collect(); + + lines.extend(randomised()); + std::fs::write(&path, lines.join("\n") + "\n").unwrap(); + println!("wrote {} vectors to {}", lines.len(), path); + + return; + } + + let mut expected = std::collections::HashMap::new(); + let mut signatures = 0; + + for line in VECTORS.lines() { + let parts: Vec<&str> = line.split(' ').collect(); + + match parts[0] { + "sr-sig" => { + assert!(ext_sr_verify(&from_hex(parts[3]), &from_hex(parts[2]), &from_hex(parts[1])), "{}", line); + signatures += 1; + }, + "vrf-sig" => { + assert!(ext_vrf_verify(&from_hex(parts[1]), b"ctx", &from_hex(parts[2]), b"extra", &from_hex(parts[3])), "{}", line); + signatures += 1; + }, + name => { + expected.insert(name.to_string(), parts[1].to_string()); + }, + } + } + + let actual = deterministic(); + + assert_eq!(actual.len(), expected.len(), "vector count"); + + for (name, value) in actual.iter() { + assert_eq!(&to_hex(value), expected.get(name).expect(name), "{}", name); + } + + assert!(signatures > 0); + println!("{} deterministic vectors equal, {} recorded signatures verify", actual.len(), signatures); + } +} diff --git a/packages/wasm-crypto/src/rs/kat.txt b/packages/wasm-crypto/src/rs/kat.txt new file mode 100644 index 0000000..6d94e3f --- /dev/null +++ b/packages/wasm-crypto/src/rs/kat.txt @@ -0,0 +1,190 @@ +blake2b/0/32 0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8 +blake2b-key/0/32 e65edfce5a36261cd824cb0f0da736b1109dcf20d2b831d598f337bb3552a3e4 +blake2b/0/64 786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce +blake2b-key/0/64 5b3cfd8f422b490b764b55eceb330b500c79cbefa9a928ad00202b8b3c5dd778a81122570434a2e3b8bfd028d105dfefd0a9576e88ed66de742ca9fbb5f8d2b6 +keccak256/0 c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 +keccak512/0 0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e +sha256/0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +sha512/0 cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +hmac256/0 5d5d139563c95b5967b9bd9a8c9b233a9dedb45072794cd232dc1b74832607d0 +hmac512/0 84fa5aa0279bbc473267d05a53ea03310a987cecc4c1535ff29b6d76b8f1444a728df3aadb89d4a9a6709e1998f373566e8f824a8ca93b1821f0b69bc2a2f65e +twox/0/1 99e9d85137db46ef +twox/0/2 99e9d85137db46ef4bbea33613baafd5 +twox/0/4 99e9d85137db46ef4bbea33613baafd56f963c64b1f3685a4eb4abd67ff6203a +pbkdf2/0/1 00ef42cdbfc98d29db20976608e455567fdddf141f6eb03b5a85addd25974f5d2375bd5082b803e8f4cfa88ae1bd25256fcbddd2318676566ff2797792302aee +pbkdf2/0/2048 35f714d09fc952c6a401e07081ac644e1e090de3c8744c28af0dd19396faee9de002d4eb6dbc1d09f1ffb96652d8a24680349622bed48aba991cd81436b3702a +scrypt/0 8356b146b42af574e460300b44136b284c796d7e73d81b1e5069b265f9da1439b3577a0604829f1223e68820075799a47b37bb86f0ca88aded76c4e97a7e9f1c +blake2b/1/32 bddd813c634239723171ef3fee98579b94964e3bb1cb3e427262c8c068d52319 +blake2b-key/1/32 0330531d097355a3f72e80d55c1245ccf79f1704431c6e3887938320442c23c0 +blake2b/1/64 ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923 +blake2b-key/1/64 5c6a9a4ae911c02fb7e71a991eb9aea371ae993d4842d206e6020d46f5e41358c6d5c277c110ef86c959ed63e6ecaaaceaaff38019a43264ae06acf73b9550b1 +keccak256/1 4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 +keccak512/1 18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96 +sha256/1 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad +sha512/1 ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f +hmac256/1 9c196e32dc0175f86f4b1cb89289d6619de6bee699e4c378e68309ed97a1a6ab +hmac512/1 3926a207c8c42b0c41792cbd3e1a1aaaf5f7a25704f62dfc939c4987dd7ce060009c5bb1c2447355b3216f10b537e9afa7b64a4e5391b0d631172d07939e087a +twox/1/1 990977adf52cbc44 +twox/1/2 990977adf52cbc440889329981caa9be +twox/1/4 990977adf52cbc440889329981caa9bef7da5770b2b8a05303b75d95360dd62b +pbkdf2/1/1 ed5eaa90fc29599df803befca3c4305baac330ee54dc648a8850eb233c0edd5c835b721009aefa870e81bbb026fd265fe7316096998299dce1689e8942651223 +pbkdf2/1/2048 a81678b52a3db3a13e307c5ec8e2d0c77b4be2fb3eaecde640acd14ca6b7f94da769cbd3391aa9221f8c90221eaa21916e455cd67c1818c4f3023a2e3fb42ede +scrypt/1 057f3a65a87ea4d7358e38387ed115ccd48329f3860aa2a038af4669fabb2a0e3ad24b499cfa1f99eb9b62e180039aa4210e5735793807689642c13a95c2113e +blake2b/2/32 a1442fdad4d4e5214e4086836e6accd66cc62d4cf3445dae60006ba025c070d7 +blake2b-key/2/32 7d866f7bcac37163a15a32a822d6ad569c8429a994e12ff94b80780a09bf9718 +blake2b/2/64 d9d6d77e0408eef086662db306f66af8852e2c70cebbf2e43ccb33c99499687b7a43897b49716c13096986f090042091052ff2c30a095c246fd4c56f16dd1ee8 +blake2b-key/2/64 9d42ae2a54bf6638b443c5f1c9935c74e5f894501cdc46cae9cd0cc19f536c3996d53cd993449519bba88f95c9be66d833c103c5f36e8b6d076886540628eefe +keccak256/2 d9317789b18e31eda7f125c541e8eca191f4b6f429970b2e23def6bebc9000d2 +keccak512/2 5345c3dadf2c61016fbb23a14ce532d75dd6ae3d7112ebaec258680acc8f70b7591ed4b66688e5501b7126182be2ef48f560ca451c60451d3d480a7c7edd92f6 +sha256/2 008549d94fa71e7a0a483d84380d05a923a4b18e79ba1f8a8ddac923956d32ef +sha512/2 6e980832aa820e5fe6c6ce011c36cd3cbe95596c9069c6067fab48bade8bbeb4e6413acb61bb1286c67c28a07e3f4099f1805a2b199cc0fe51aa5cfb1b66a40e +hmac256/2 df667edcc6df9bb665b74643b50a7a7bddc394e8acc2a0bf16d000330d39db73 +hmac512/2 7df02b56487c0448f88d6e44c729dc6ded0b0a3add5e7e97e2b5fb8981416fbaea03e991f3c779cfa790eb69ca6c08f596b7e3b9af36b293fe68fadfd5d3b70c +twox/2/1 8dc5e3cdc100339e +twox/2/2 8dc5e3cdc100339e6e7ef29bc88dfcd7 +twox/2/4 8dc5e3cdc100339e6e7ef29bc88dfcd7c877b13a6b38c137d269ec9a21c100ce +pbkdf2/2/1 3f4ed9a95e4b71232c3746d036eb7df2e3e469e2a78f7b4fb593c1a766805dba0bdbbfd349b63438c9dd4c555d36e9d3ce91f3d709d7d7d2d499a2b263da4f63 +pbkdf2/2/2048 5275d2231e2fe9ec731f790a679641fec34b2e92806d8aca37b6c87e4b8049579c6e6eae5cf2679280617f2480f81e39f9c4ddf1e4d7292117eaca48af422838 +scrypt/2 4ec391c472568d379316c8a14a69128a2aaa27d5d66635e7c682a90af07be9a2ec09d618f6dbf222bbe676883c8b2bf52a3f3600b6bea403ce04f9c123de166d +bip39-valid/0 01 +bip39-entropy/0 1a486a5fbe53639984cb64b070755f7b +bip39-mini/0/0 fac7959dbfe72f052e5a0c3c8d6530f202b02fd8f9f5ca3580ec8deb7797479e +bip39-seed/0/0 02d5cd1db85b4d1397d78978062a1160e76e94cc5aaad3089644846865bb18fc +bip39-mini/0/1 7093ab08d7abbb67ff41479a98ef998e4be773901f13668a012f51d207577a88 +bip39-seed/0/1 a6a63e14e4aab9ea6d031a84fd49650b337cc06916f8c8e7bb1e6b3a47024867 +bip39-valid/1 01 +bip39-entropy/1 00000000000000000000000000000000 +bip39-mini/1/0 4ed8d4b17698ddeaa1f1559f152f87b5d472f725ca86d341bd0276f1b61197e2 +bip39-seed/1/0 5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc1 +bip39-mini/1/1 452cf529afdeea38864bda6a771ec77c165498e57c8b53270a918e2a95d6e384 +bip39-seed/1/1 319a85221b9c4ce9a2896ed8cb2c0ea205c44c512d9214c9d80e663b8aa97f09 +bip39-valid/2 01 +bip39-entropy/2 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +bip39-mini/2/0 f02cdc109954e34cd3f0c60fdb0c97ffb3a934ad1cc9a4df87b8417024b8bdbe +bip39-seed/2/0 761914478ebf6fe16185749372e91549361af22b386de46322cf8b1ba7e92e80 +bip39-mini/2/1 91ae31651bbded60d4abbd2aaeada3fc32dc4883aa42bf74aaba714a7cc370b6 +bip39-seed/2/1 78eb30f9eb2e381142f81fb2f91af8009a7bae045353c81d41b9965e79753042 +bip39-valid/bad-checksum 00 +sr-from-seed/0 5046adc1dba838867b2bbbfdd0c3423e58b57970b5267a90f57960924a87f1560a6a85eaa642dac835424b5d7c8d637c00408c7a73da672b7f498521420b6dd3def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 +sr-derive-hard/0/0 5044f1b94dc23e1422b8ff1d16e5c185acd6b1ab0b045edaf52da481e6060f4aeba185d47626304c56ce22f661d7e04bc060bf92367a240487ad3368dfa4f0587eb473cf3ffb7f799a5e7e8a3d864bc9fb558ad77ffd45354f5a64733a8dcc5b +sr-derive-soft/0/0 90a1831445febebaa7ad670736e7e1a7bc7a40c860d11a0d45a834552241e70182cbd8a1cbc65ae31b6606f759c2774846b051c4ec605652d96c39525fbcfd14 +sr-derive-public-soft/0/0 82cbd8a1cbc65ae31b6606f759c2774846b051c4ec605652d96c39525fbcfd14 +sr-derive-hard/0/1 f028af100e19eb2d977031a7a119d61b3b74d230566da8047b5dfab057d199605ba3dce88aad5127a2d9c2d9e15fffb12cf00a6539b4c5a8ab1f6cf1193028ddeef10a01961b20f466467b28afd462be66cc747df9dd2a5c932eb7a05bc1af41 +sr-derive-soft/0/1 d06e1aab2adca5772c61a9b1b290aa850ceda6c68dddb7cea89cccece53eac0cac99e7d9f2b492a0f87a976817f6608b24aaf14206b5e7d5dfd7713a10795620 +sr-derive-public-soft/0/1 ac99e7d9f2b492a0f87a976817f6608b24aaf14206b5e7d5dfd7713a10795620 +sr-agree/0/0 167b3784188f948efda66d3e08b71354f258db1665b4e63abf903b6319372668 +sr-agree/0/1 6cae5cd4b5ed7f11ddb9a0c20d3acbb51c6027ec291fa2f8b9b23e86a4903112 +sr-agree/0/2 eec62f77e9c050cc1da6920441ec7fd30fc2471c5633ecc0151265068fa2021d +sr-agree/0/3 dc75f9d7da57ff15e65def295e1a416a53577701b15b3de904c38031297b8d7d +vrf-output/0/0 8034451570f66a23cd631f06a53a32683eb187aa00545bfe9653a255a0e36b49 +vrf-output/0/1 301103529195cb77dc71efdcf5247817d40fb3d17c2a66a433a98e8a005e155e +vrf-output/0/2 74bed1f7eede4ac3f11ccd72094732987b897994e31f106dc42844bd1146d112 +sr-from-seed/1 10174084cbded240bf5356f2f95f5dde0f8db69ccad7d59e70b871887e597a628b9567dc8368839e2346f9553b4968c6fe856d5a7669f1c54e96f65cfda4b039de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f +sr-derive-hard/1/0 e03363daba6aa72fcf612b75fa6332c0293f23eb7fc3867832f1ff6dc00500525f2be6935ae55cd6ab40e1c4f278972b31e2331cb15193ae01c58b61545077fff0af6c7273314323ecd59b7751f6af00535e91be0c706a55c7e171706ec4d006 +sr-derive-soft/1/0 28b95df54828b985d5e0097049bd347fcc711b44fe0850d4db84c14d5ad27d17f66f661828ec788ca585703c0a14cc13a4d385299cfdfb148f4f554a1791f12e +sr-derive-public-soft/1/0 f66f661828ec788ca585703c0a14cc13a4d385299cfdfb148f4f554a1791f12e +sr-derive-hard/1/1 2881967aef71dc5c5385863b7ae78d901f2c48dcc0a6d3a0d1d3aaf62e2e935429943d0a1042cf3392ed094bbedb495c988401d753de3d67f8359513243a0b9d6ec838a4b1373518b303544d098c0636dbabc63703c8bb5b24e5f36ba5cc527c +sr-derive-soft/1/1 087a06cb2153ded6faf219db4aa987b36beeaa1b7fa0602bca6e5eec92b098627454f8850f657d7d6ce095fd95cf960b5a3805746269e7ebb04d346bfb850208 +sr-derive-public-soft/1/1 7454f8850f657d7d6ce095fd95cf960b5a3805746269e7ebb04d346bfb850208 +sr-agree/1/0 6cae5cd4b5ed7f11ddb9a0c20d3acbb51c6027ec291fa2f8b9b23e86a4903112 +sr-agree/1/1 924c672d1fab64258297edf443ca56d08c214cff4a01f42a1386ea5ec7a56133 +sr-agree/1/2 2a799825b0bedcacc2b612057beb92d27ce3373fc98e90a6fae94e61ab0a656b +sr-agree/1/3 66d68f1a30ddc58cec6c823c6d9508bb2dd9e48ffc892aee4236d9f1d2646807 +vrf-output/1/0 82efcfd875532dd24499defd3ffd0c1d4940111cd5e780b96027c799ef390648 +vrf-output/1/1 7c6d026b220fb01a1301bb704d0c30c6e640a69ef52e0d35ef442670e26fc97b +vrf-output/1/2 3084beefb7ac40f766731657c5e776f4a15e20beca9eef8842121e2b3910dd22 +sr-from-seed/2 18b5f3e9309e299a29105131170fa7be75d1dd8b3a89074a3ee24e564deb6b5b433878ae7fe6b5e12e48d14574ef972534a02797c5f4a4ae4bde996256f619b16203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d +sr-derive-hard/2/0 407f24ae017ce772e36bf577ab705547658cfed7b34d4afe3734be5476119a69f8fcdaff281ff8c13cc1419d7c841028c1ce21b55f2ba51dc646154356cf6cf894e23f5a2546a3a1a2677ff796b0e0e920da3cecc952ab1a8021519775352d5e +sr-derive-soft/2/0 282441e695a327a73028d4ca68749bfa995887f9fc8b73826efef7cf627ec07542581161e52bd1f724155363bffe777eecc177bf1fdbf26b592708a4db4f902e +sr-derive-public-soft/2/0 42581161e52bd1f724155363bffe777eecc177bf1fdbf26b592708a4db4f902e +sr-derive-hard/2/1 6893644ead32fee42054765cfdfd6782dd05fe71aa42e5f2a0b3a72818e04c5d4dde56050f646d29415387517e9b3408887e86cede78b5ce83e303255f20e994dc824fcc74ce2b393e73f5f18cd2e29dba66d5411da3860399d74f8556eccb71 +sr-derive-soft/2/1 5807278a18c2e1a4507293abe3fd236e519375e4e624555e787ea34596917a74362e7c82958a3a5cae8a8cd990164988b51a4cfde7003de403c98602fa878d4f +sr-derive-public-soft/2/1 362e7c82958a3a5cae8a8cd990164988b51a4cfde7003de403c98602fa878d4f +sr-agree/2/0 eec62f77e9c050cc1da6920441ec7fd30fc2471c5633ecc0151265068fa2021d +sr-agree/2/1 2a799825b0bedcacc2b612057beb92d27ce3373fc98e90a6fae94e61ab0a656b +sr-agree/2/2 1a6103aa0dcb2e6bcc500b2a15a4e7523e831e61d85daa30630c25241e74187e +sr-agree/2/3 f4ba4a535cb371f26f1abc39d0b02911f9fc70daee91f7c12fcfa3113adcf033 +vrf-output/2/0 60976686251d496cacbb2f4e0659aa4fd056b29fed678528d08f6535b1edf469 +vrf-output/2/1 94ba6bcd758ccfae3808ecea73d5c490e9c5c114dfcb5264a5190d808e3d600f +vrf-output/2/2 c467f93dbc5f425b6a506e2749dc8b29851587f7611aaff248ee291c65c48a35 +sr-from-seed/3 f0106660c3dda23f16daa9ac5b811b963077f5bc0af89f85804f0de8e424f050f98d66f39442506ff947fd911f18c7a7a5da639a63e8d3b4e233f74143d951c1741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 +sr-derive-hard/3/0 30db0fea8835bd5baf649a7bcefe3896b1155771d3e1a7629137d9c679fe4a43f53fe39df0fbcda94acf7386ebf8311c286559864c03f4379d2d40ffc874a87a0460ff03efdc8f3eeae36ad282d41a8398e20703c5504fbc18ec238df4b9855b +sr-derive-soft/3/0 78e2c707b9a946a6afe82cee0bef0c7db1983f5e050de868337f62eb978e492a68d447f32488ba7a1a65e3a0ffa11e747dae52aea4a18b789980f23477c52356 +sr-derive-public-soft/3/0 68d447f32488ba7a1a65e3a0ffa11e747dae52aea4a18b789980f23477c52356 +sr-derive-hard/3/1 a8bf865205c69ebcdb1efe9edec3b96ea65dd9a071f01e76c91c2af940645f44e96cf7443b19c1866b66535cbcff7afc4b135971ab2ce3bac1ab5e4e4b0e9640106bf4e2d66af916c7b893c7f377ee7c55bc7b63dbbf86f0b65696fe71afcc26 +sr-derive-soft/3/1 00223435066f51ece75129f67ba4ec74bc86dfdc951d43f93164d061d3ba7a53f869cd2226b3e1d4648e90c2ab8ed9db5243e23e9d12a814f060b5c447fda835 +sr-derive-public-soft/3/1 f869cd2226b3e1d4648e90c2ab8ed9db5243e23e9d12a814f060b5c447fda835 +sr-agree/3/0 dc75f9d7da57ff15e65def295e1a416a53577701b15b3de904c38031297b8d7d +sr-agree/3/1 66d68f1a30ddc58cec6c823c6d9508bb2dd9e48ffc892aee4236d9f1d2646807 +sr-agree/3/2 f4ba4a535cb371f26f1abc39d0b02911f9fc70daee91f7c12fcfa3113adcf033 +sr-agree/3/3 12769eae8157152c1a69e4459a7fd7b1c4ce55d8a5eb68aaac9324df08c7dd1f +vrf-output/3/0 148beca7e06f7af6b57afaede17362acfc6ffe64a341274428daec2673391023 +vrf-output/3/1 de4cb325ffb4c4b4f71c2992dddc16822614ab8095e30c5abe22b125ac480110 +vrf-output/3/2 ccda5008c43516b79733d6d8eb3634f0450d1b9ccfca0b205420dd78bcb32d66 +ed-from-seed/0 00000000000000000000000000000000000000000000000000000000000000003b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29 +ed-sign/0/0 8f895b3cafe2c9506039d0e2a66382568004674fe8d237785092e40d6aaf483e4fc60168705f31f101596138ce21aa357c0d32a064f423dc3ee4aa3abf53f803 +ed-sign/0/1 b17a3d196768eb182c746cdc592ecd5ba54b815a300a08efaf08893a0fcaf7bb2c2d0b9e7f108f0e257d79db7a79786445db8631c42ee7693cd75477737f0c00 +ed-sign/0/2 8b7e54ff43aa6385f57ded8b5a903549c7c6783d28b3492ed542f29dd8a2ab387542ddc24b770758c5909ec56caa4901ed90013e338d28fe753f2b1f6b601908 +ed-from-seed/1 0708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252600d05a1d1ea251396d557afbd4588b3c6d99dbeb972fed10a32562ea26dcdcfa +ed-sign/1/0 26caf293a0b11c2c88f2f9e98efdb42e32374943589bfa449998a1738f93a3d4773ecf386def504ff8f5febd5118a28ae5747ac92c656609d0a3631d5d59a90b +ed-sign/1/1 1317bf325ad62aba070e8fb9cfb3886e31750c6865b78355fcc4d75a6b810041fdcf756d5bc6e144f7f9cad4b893719af6432233acf7c8daf21414ef72b9b703 +ed-sign/1/2 fc354b2898a0d700924879de329b5ab6f6fc2d0c3d2579633b7ee8c0e81897e1eee10efd7e7d0b98ce889cdeb266ccaf837d20b4aa82dfa3ed73bc38820b4805 +ed-from-seed/2 0768c92f90f157b81e7fe046a70d6ecf3596f75dbe2485e64cad1374d53b9c029ab3e3b7fabda8a899c3a93b711ce3e9c092793491a49ab3f93331db7a1a0f8c +ed-sign/2/0 dacab8d76acb5a01d013adf2ddd496e40219c6bfbd900de355eb15acb4bce2ae0b7430fe49f710415b392d6280f2490ee7a58c775d661796fe79adc1b6dd1e0e +ed-sign/2/1 c590b0f69cd4249904292ccd6730a454dd51bafcafa1844a01c5ea64ac162c17b9bd7041faa0eec85f92674c86cb3cda027634c6c4e17837991135865be03901 +ed-sign/2/2 9f115cbe6ff1829400c2ed3cc90a325d0a48cf180fde0cb148064800911d6b81e0a38a62b4c7e12fd630c5588e2fb90814c33e1ca2fade665da245e2251e6200 +ed-from-seed/3 31323334353637383930313233343536373839303132333435363738393031322f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee +ed-sign/3/0 9307490e912de0ee8eba762e2dab214b142d9943469db0698274ccb3a091a5df24dc0bed309a808c4cd7ba1addd17a5ede576283566f22915884d3c361db400d +ed-sign/3/1 90588f3f512496f2dd40571d162e8182860081c74e2085316e7c4396918f07da412ee029978e4dd714057fe973bd9e7d645148bf7b66680d67c93227cde95202 +ed-sign/3/2 e5d1b0dfa9cf77a5a36e6d67c65ae9241d4fa08dcda94da4d294870bae05561f2a78f7053f5082d2b4a889307eff3dc909e36edfc05656806d4594542e5f9c0f +secp-from-seed/1 0708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526029fc3f04c2c6e14d06fe30048fb902506d674f5f7543dfde498b1d26e1a6c1f55 +secp-expand/1 049fc3f04c2c6e14d06fe30048fb902506d674f5f7543dfde498b1d26e1a6c1f55f0ca1d755158126236856b08e5ef1c7f58953fa09c681d33fe63f02e07d0af26 +secp-compress/1 029fc3f04c2c6e14d06fe30048fb902506d674f5f7543dfde498b1d26e1a6c1f55 +secp-sign/1/0 f835e88462a652882078de1c490788ef2bcf5c3654f46ab2dd57d75732420ffa1e345a225a4f6b4159344e96179390e50ec2deda161f0c21a80aa45880cf5fdc01 +secp-recover/1/0 029fc3f04c2c6e14d06fe30048fb902506d674f5f7543dfde498b1d26e1a6c1f55 +secp-sign/1/1 20d00d17b9beb4920f1f2b868ff4f97f37d81305bfdd5251c4ad1166f8b1f74303f816436197dc2d0548a188224f20515e19d1214a2eb84acb660fd797925b6800 +secp-recover/1/1 029fc3f04c2c6e14d06fe30048fb902506d674f5f7543dfde498b1d26e1a6c1f55 +secp-sign/1/2 6b5e6b28801042beb245714ae0e637b6f9eecda27872eedb89662f3a9eb7a7f877323adbd8630226700325f379db189ae11abf7f701e25899f11d9d93203315e01 +secp-recover/1/2 029fc3f04c2c6e14d06fe30048fb902506d674f5f7543dfde498b1d26e1a6c1f55 +secp-from-seed/2 0768c92f90f157b81e7fe046a70d6ecf3596f75dbe2485e64cad1374d53b9c02027854493edced8484912d36f6b8ac3aaf28fe5b7db24341ff5b489b84679fc535 +secp-expand/2 047854493edced8484912d36f6b8ac3aaf28fe5b7db24341ff5b489b84679fc5350d083efb4c1199c119862d8d48741a4e471778b892e929e61d083494790b7f16 +secp-compress/2 027854493edced8484912d36f6b8ac3aaf28fe5b7db24341ff5b489b84679fc535 +secp-sign/2/0 a4ce55a43e3483b38cb0c3423e16caab5d3c4ef754a22dd57de2488ea06a8d4c3be5ea6c3a17ac80f44bc6fb16d42983fb1903a7c762ba2bd97a771e5258b03101 +secp-recover/2/0 027854493edced8484912d36f6b8ac3aaf28fe5b7db24341ff5b489b84679fc535 +secp-sign/2/1 6a2fc029d7732e9a4c148f06456493552ae117f2a9bc16362b204a11541cff202b7bb6fa926d3f2060a1d01c43c1ec194deb7dd397161ef16c11a906147c16ee01 +secp-recover/2/1 027854493edced8484912d36f6b8ac3aaf28fe5b7db24341ff5b489b84679fc535 +secp-sign/2/2 61013addf85a6c17db744c01806151eba601c78f94676116684f8f18503c68822a6bfc7fe4bac84f1327d067d1e412a1c752961f9cd3f172010d9f035e43157f01 +secp-recover/2/2 027854493edced8484912d36f6b8ac3aaf28fe5b7db24341ff5b489b84679fc535 +secp-from-seed/3 3132333435363738393031323334353637383930313233343536373839303132035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9 +secp-expand/3 045676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba995840f3de562156558efbfdac3f16af0065e5f66795f4dd8262a228ef8c6d813 +secp-compress/3 035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9 +secp-sign/3/0 c4d4c1a10f58684a3e3c7fb67a8548bd590f80af64dfd48bcc6536e2154e4d3e70723a81f9632f374e695cecdb8a0fe0454b1ff286eae33718de64bb5e356ba501 +secp-recover/3/0 035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9 +secp-sign/3/1 ffe654ea46d9d27cd83ea6910975ed177f02e9a18638faf42dde95d62bd37c387b91c7eba9c5f13f1c57ca1b58eb1af0d5a82838d75b1661c444db6cd367696201 +secp-recover/3/1 035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9 +secp-sign/3/2 531bb640dae78253cd466cd851e6d7a9b4354b37113916b5c3c3e2574bb3e58e6008c7a5eed95d50619b7b6b2a79218edc23a96379228d6d40be9038701614a700 +secp-recover/3/2 035676109c54b9a16d271abeb4954316a40a32bcce023ac14c8e26e958aa68fba9 +sr-sig def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 489ef0f010a64a29fe278249fdf508a2ce10343c870d355b3924808dd578105ac62a7d03c0bddcc4ce18a37ef11c3f8e9c368359ed5651a6cbc158045e55e38f +vrf-sig def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 8034451570f66a23cd631f06a53a32683eb187aa00545bfe9653a255a0e36b4966c32822d053d2b22d117e93ed487dff3e87fd0f5a24f4b1819689e4ad105805e816caa25dee6b2a5cdfbf0f0a729e4b1eb13ef68fbaaafcddbaf28cb6e13d02 +sr-sig def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 746869732069732061206d657373616765 6227fc211d63e52f0c503c9e83b6cb08dc4b425549ff1353a278ec96bf8e092adf00d9abc61bc5813b5c51c0b880962c9dd090432fd6a50d8169bdb449c54f84 +vrf-sig def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 746869732069732061206d657373616765 301103529195cb77dc71efdcf5247817d40fb3d17c2a66a433a98e8a005e155ec45289f04e912c7fe023aa8de6bd18ca1c6a4503f4cba42e28b9b347d3d04b0d0467674d5bb81a64e61bb76dc8faf0d329503bee350f9c11eae39b50cfcbb10a +sr-sig def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c 92c5e8af927f2a6f05f4d0c2e98216fec55be4ef04d3056713518bc92d9cb930ebc461d3856268f0f5ce309a0f253d331b04140a8b86f32820d1ff14a9888f8a +vrf-sig def12e42f3e487e9b14095aa8d5cc16a33491f1b50dadcf8811d1480f3fa8627 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c 74bed1f7eede4ac3f11ccd72094732987b897994e31f106dc42844bd1146d1120eccdb5e58fbd8670f34994b1799d1abbac05a94c71acbcd9307028647289e0c31099af1dbe439980a9ceb9ec13d0d02697cbfba563e9821d5f92ecd2cf7c007 +sr-sig de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f 80ebf0b599bbd01d981b56f80b79ab85a31fc1b055f839d8b10d5bf67d9e3d21316161bf3f1898160960e94d2cd174f4dff9f42b4bc35dc29c7059480b47ab85 +vrf-sig de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f 82efcfd875532dd24499defd3ffd0c1d4940111cd5e780b96027c799ef390648d88bfa89260ecd557638dfe76d1c4c94b908c7a31464595e912f889ace79c30f77b14188af3d46dc57efbe09a7852ecfb62bfcdcf119c3657a23fa899a3f4508 +sr-sig de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f 746869732069732061206d657373616765 a8f97775d5a0576cf5530a8eb6baa63e2d2ecf610c9db682cb06c52d40931f323e446a5284e9966ccd2643dc6e91341adf6a097733904704feb0c517108ca38a +vrf-sig de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f 746869732069732061206d657373616765 7c6d026b220fb01a1301bb704d0c30c6e640a69ef52e0d35ef442670e26fc97b8a8e371e84fd521267123a09fad8ac4d872dfa422d8aaa3336ac8a181b1c3a0dcf2b60ecdec3ae5ef4d173dd18bc5af5f7d6567f78a709e1294c1f59e2d81f06 +sr-sig de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c e82217ad07422ca25fb31f55d4d5cf42bee685805d6df610b80e1a3a8a1db34b3ce20bafeba409f16897796ccf003c49d180b4c0385c268eef708246eead2183 +vrf-sig de4ffab050e3f3f1f982b872c5ec0455294fd16afd9075f75e9379a3bbde725f 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c 3084beefb7ac40f766731657c5e776f4a15e20beca9eef8842121e2b3910dd224a56473e60302b2d75debce2ee9c58a96d4aa51a925a5fa9b329a2a017821e00df68f265212c530894ca79f7e34645b2e6231f988556079eaf42c917d9a48309 +sr-sig 6203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d 5a26f5322c87182853d2dd53efe8ebf99e5af4f91eec877b70a04480a461c87f4f5dca4524ed4a402f44d3f7df25e9d7b774d3faf72e55aa4b1f21434ed43283 +vrf-sig 6203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d 60976686251d496cacbb2f4e0659aa4fd056b29fed678528d08f6535b1edf46917918ece5448de5c785e68fd87c55a51479c8c73b924993beb7ab3e5df0d9c048438dc24fa5e55a5d5da664352200abdabf24c9ff2c48c30ee96ea068a62090b +sr-sig 6203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d 746869732069732061206d657373616765 fca168d5fbd24de746a8355bd7b7ccf63be6004d409f57cbd5cbc4417d7cd62a1744ab46e8727f07d97d4c3d365c45a1fdea956c3ee8cb06ef2c76bd7f1a5185 +vrf-sig 6203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d 746869732069732061206d657373616765 94ba6bcd758ccfae3808ecea73d5c490e9c5c114dfcb5264a5190d808e3d600f84f43f5e35779d0b1e7d0a7363bdd956bc2fd307a2848ec453ee1f4c24363a042c1089a2384872bf1bad1150836275e6c46d33d6c0c5212b2db4ca123e14e703 +sr-sig 6203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c 8cae0772e5b1a61f20b470b4ad6c1e39ae7a0b6c1df91ec2a2400c266260233211ce9642733d8dcea1c379a7bf7fae26ad61b08010f403293999885c329dbd82 +vrf-sig 6203b67c5d1c658dee4b31a11cfe03d92552b2797c2a133c8a19682cf24b190d 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c c467f93dbc5f425b6a506e2749dc8b29851587f7611aaff248ee291c65c48a350e013366e544e139aaaed170e8e6f0d286e0da524e63113e4833101bf8d2320b34734ec4aaa25bec04efccc58769c7025e6206be845e6d1e31e4d694c4f8b308 +sr-sig 741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 06ca2e9488b09c7c04da6aa1c76d21d9a8d46b76e6aa9de90fdd0fce5a631b480e17f117b91a40078b860187c1f73a826a990307e6274964b3c56a48a86d6d83 +vrf-sig 741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 148beca7e06f7af6b57afaede17362acfc6ffe64a341274428daec2673391023156cd7ab6b592e06b7db0730a03087daf1db0b2cca53a8003b4320808167ac07832d70afe11d94053a5e4797bdda84e0648d36cea531f6106fe7959a47bcc20d +sr-sig 741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 746869732069732061206d657373616765 04702b7b88ae806032fb95a8d8e9ad49dda9cc0750e75b44ee5693b0869be64108454fc72fc7344aa32663f369c6bc6a916a0b82910ad6c56ef4a15d25ce1b83 +vrf-sig 741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 746869732069732061206d657373616765 de4cb325ffb4c4b4f71c2992dddc16822614ab8095e30c5abe22b125ac48011075ac32720223d70f2b89b8fa95f94851dd14f14bf1baca89431895f4cf12fd0ef6176912c3d8a5d526fe33adc0dac19a974d3205eba3f9415e4e2e05d554e807 +sr-sig 741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c 3afa41b7c10ae063c807fd2cbe8eaf63a25bd8a3af26a1f6685b0896190f5b481a29aa6ab2a2560ebdb3792739aa609c8cf183a77b3d9c81bc8be8c716916e8c +vrf-sig 741c08a06f41c596608f6774259bd9043304adfa5d3eea62760bd9be97634d63 070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c636a71787f868d949ba2a9b0b7bec5ccd3dae1e8eff6020910171e252c333a41484f565d646b727980878e959ca3aab1b8bfc6cdd4dbe2e9f0f7030a11181f262d343b424950575e656c737a81888f969da4abb2b9c0c7ced5dce3eaf1f8040b121920272e353c434a51585f666d747b828990979ea5acb3bac1c8cfd6dde4ebf2f9050c131a21282f363d444b525960676e757c838a91989fa6adb4bbc2c9d0d7dee5ecf3fa060d141b222930373e454c535a61686f767d848b9299a0a7aeb5bcc3cad1d8dfe6edf400070e151c232a31383f464d545b626970777e858c939aa1a8afb6bdc4cbd2d9e0e7eef501080f161d242b323940474e555c ccda5008c43516b79733d6d8eb3634f0450d1b9ccfca0b205420dd78bcb32d665bb235b82980d7913df4bc52d257a08d4b4affc3273e8f10dc9840561a5be7003ba4937bed0d3e124dfe2047f11b91422c7578ac727904f53402bec72d44b00e